Unity3D动画基础

背景

Unity3D开发不可避免需要做一些动画.
于是参考一下网上的内容做一些笔记.

关键抽象

最基础的单元: Animation(Motion类),
用于记录一个单纯的动作,比如x轴坐标在1秒内从0变到5.

基础单元的编排工具: Animator Controller(Animator类),
用于编排多个单纯动作的时间关系,比如0秒开始左右移动,1秒后切换成上下移动.

hello word

  1. 在资源窗口中新建
    1. Animation
    2. Animator Controller
  2. 将controller拖到被控制的物体上,或者在物体上新增animator component.
  3. 编辑animator controller,将animation拖入后设为默认状态
  4. 编辑animation
    1. 先点击要录制的物体(不然无法点击后面的Add Property)
    2. 然后在animation窗口中选择要保存录制结果的对象
    3. 然后点击Add Property开始录制某一特征,比如坐标,比如旋转,比如scale
    4. 通过设置关键点或者调整曲线的方式来设置
  5. 编辑animator,将录制好的animaition设为默认state.
  6. 运行查看效果

Animation

概念

主要录制一个特征,可以控制的都可以.包括且不限于

  1. Position
  2. Rotatin
  3. Scale
  4. 其他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的效果

  1. 点击A.
  2. 右键Make Transition.
  3. 点击B.
  4. 还可以设置B->A的路径以完成循环的效果.

点击A可以设置A的一些属性(比如播放速度).
Transition也是可以编辑的,主要记录一些动画和动画之间的渐变转场效果.
官方给转场定义个一个 触发条件 的概念,用户可以自定义变量来控制什么时候一个转场可以发生.
官方提供了默认的触发条件: 一个State执行到还剩25%的时刻.
用户可以自定义为查看每个变量是否为True等.

一些接口

可以通过Animator.Play(‘state name’);让animator来执行其中的一个状态,
该状态执行过后也会沿着Transition继续下去.

个人评价

在animator中又可以定义animation的一些播放速度等属性了,
把该在一个地方定义的东西分散在两个地方,完全就是胡作非为,毫无章法.

参考

  1. youtube上的动画教学