Unity3D动画基础
背景
Unity3D开发不可避免需要做一些动画.
于是参考一下网上的内容做一些笔记.
关键抽象
最基础的单元: Animation(Motion类),
用于记录一个单纯的动作,比如x轴坐标在1秒内从0变到5.
基础单元的编排工具: Animator Controller(Animator类),
用于编排多个单纯动作的时间关系,比如0秒开始左右移动,1秒后切换成上下移动.
hello word
- 在资源窗口中新建
- Animation
- Animator Controller
- 将controller拖到被控制的物体上,或者在物体上新增animator component.
- 编辑animator controller,将animation拖入后设为默认状态
- 编辑animation
- 先点击要录制的物体(不然无法点击后面的Add Property)
- 然后在animation窗口中选择要保存录制结果的对象
- 然后点击Add Property开始录制某一特征,比如坐标,比如旋转,比如scale
- 通过设置关键点或者调整曲线的方式来设置
- 编辑animator,将录制好的animaition设为默认state.
- 运行查看效果
Animation
概念
主要录制一个特征,可以控制的都可以.包括且不限于
- Position
- Rotatin
- Scale
- 其他Component中的变量
录制和插值
典型地,针对某一个变量的时间轴,默认已经有起点和终点,
此时可以插入一个关键点,unity会插值出一个比较光滑的曲线.
当然也可以手动调节曲线,官方还提供自动平滑的工具.
关键点和时间轴采用正交的方式,不控制的地方可以不加关键点.
(比如只控制x轴,那么y,z虽然会默认加上关键点,但可以手动删除)
但关键点的修改不尽如人意,还是曲线的方式更好.
脚本扩展
可以在动画的进程中添加Event,然后将一个自定义的C#脚本挂载在Event上,就能调用脚本中的函数
坑
即使animation中不控制y,z轴位置,只控制x轴位置.
运行起来还是会控制y,z.(个人认为是官方bug)
此时的方式通常是将被控制物体嵌套与父物体中,
然后以父物体上挂载的controller来控制子物体的x轴位置差.
一些默认值
默认播放1s,
默认只播放一次.
个人评价
可以直接设置animation是否可以循环播放,
但个人认为这是编排工具,也就是状态机中该做的,而不是animation本身.
不过可能unity为了照顾以下情况做出了妥协:
嫌麻烦不想在物体上挂载animator,animator中再装animation,
就想直接挂载一个简单的animation.
Animator
概念
Animator以图的方式进行组织,是一个状态机.
最基础的节点就是State.这个state可以是空,也可以是一个Animation.
入口的状态是Entry,
节点和节点之间使用Transition连接,Transition本身可以通过变量来控制通断.
至少要有一个连接,被连接到的物体称为默认状态.
编辑
假设已经有两个state,A和B.如果想实现先A后B的效果
- 点击A.
- 右键Make Transition.
- 点击B.
- 还可以设置B->A的路径以完成循环的效果.
点击A可以设置A的一些属性(比如播放速度).
Transition也是可以编辑的,主要记录一些动画和动画之间的渐变转场效果.
官方给转场定义个一个 触发条件 的概念,用户可以自定义变量来控制什么时候一个转场可以发生.
官方提供了默认的触发条件: 一个State执行到还剩25%的时刻.
用户可以自定义为查看每个变量是否为True等.
一些接口
可以通过Animator.Play(‘state name’);让animator来执行其中的一个状态,
该状态执行过后也会沿着Transition继续下去.
个人评价
在animator中又可以定义animation的一些播放速度等属性了,
把该在一个地方定义的东西分散在两个地方,完全就是胡作非为,毫无章法.