Unity Playable API 自定义动画系统


讲自定义动画系统之前先说说其他动画的缺点:
-
传统(Legacy)动画缺陷(Animation)
( Animation组件就是用于Legacy动画 )
下图是Unity为Legacy动画系统自动生成Animation:

Legacy动画没办法使用Mecanim动画系统(Animator)的以下这些高级功能:
-
动画重定向
(重定向技术是一种在将动画数据从一个骨架拷贝到另外一个骨架的过程) -
Blend Tree等
(一般用于移动相关,例如用0~1的值来混合切换状态,比如值为0时是待机,0.1~0.5为走,0.6~1为奔跑,动画之间的切换是平滑过度的)。

2. Animator缺陷
(缺陷主要是在一个角色很多动作State的时候体现)
- 当有很多动作和状态的时候,可能会变的庞大,蜘蛛网一般的状态机。
- 不允许运行时添加,删除动画,只能使用OverrideController来替换动画。(OverrideController据研究性能方面不太好)
- 巨大的状态机维护起来十分麻烦。
自定义动画系统
可以用Playables API来定制自定义动画系统。没有专门的工具,就是靠纯代码实现自定义动画系统。
简单的说,Playable可以通过一组API来创建一个Graph,而每个Graph可以由多个树形结构组成,每个树状结构都由一个Output节点作为根节点,叶子结点则由各种Playable组成。
官方案例:
引入方式:
Window > Package Manager > 左上角"+" > Add package from gitURL > 输入"com.unity.playablegraph-visualizer"
附上结构图
它提供了一种创建工具,动画系统或其它游戏机制的方式。Playable Graph允许我们混合和修改多个数据源,并通过单个输出来播放它们。
目前Playable API 支持播放动画、音效以及自定义的行为。我们把它设计为了一种通用的接口,它并不是仅仅针对动画的。以后还会支持视频等其它系统。
适用场景:
适用于一个角色有大量动画和状态的项目,或者想把Animator混合树功能和Animation混着用。
目的:
- 给喜欢Legacy动画系统(Animation组件)的开发者一种相似但是功能更强大的接口。
- 定制动画系统
- 提供可以访问底层动画系统的接口
- 可以扩展Timeline的功能
优势:
结构简单
(它不会有庞大的、蜘蛛网一般的状态机,结构可以跟Animation结构一样,再此基础 上可以扩展功能,如BlendTree)。
这是官网案例自定义的动画系统,表面上跟Animation组件一模一样。

-
运行时创建,添加和删除
作用:
(1) 可控制动画加载的策略,可按需加载以及异步加载。(动画状态机是不允许运行时添加、删除动画的。)
-
可以直接控制动画的各种属性
(1)控制播放速度:比如暂停一个动画把它当做一个Post使用。
(2)控制权重 : 可以控制每一个Playable的混合权重,通过控制权重可以实现类似
Blend Tree,Transition等功能。
(3)控制更新频率:常用与性能优化,例如:那些距离Camera过远的角色降低更新频率。
-
强大的融合特性
1. Animation clip之间混合:我们可以让二个动画按0.2和0.8的权重混合。
2. Clip 和 AnimatorController之间混合(甚至无数个AnimatorController之间也是可以混合的):
-
同样可以实现骨骼分部混合和加法混合
类似于Animator中的Layer功能。这在我们混合全局姿势和局部姿势时会非常有用。比如RPG中上下半身的动画,像是边跑边攻击之类。
其实简单总结的话,Animation和Animator有的功能我基本都有,在此基础上可以按照自己的方式来扩展。
缺陷:
- 没有直接使用Animator(Mecanim)来的直观
- 需要程序员们开发更多的配套工具(例如:动作文件生成工具等)
- 需要一定的学习成本
原理:
驱动Playable Graph的实际上依然是Animator组件,所以在使用时需要你传一个Animator组件给Playable Graph。但是你完全可以像使用Animation组件一样使用Playable。
PlayableBehavour
PlayableBehaviour是一个供用户自定义行为的类。
功能:
(1)我们可以对Playable进行直接的访问和控制
(2)它也定义了一些回调函数来捕捉一些事件。例如:开始播放时的事件、销毁事件,我们想监控这些事件时就离不开PlayableBehaviour这个类。
参考文章: