前言
对于同一个精灵,会有多种状态,在不同的状态下呈现不同的动画效果,这是动画状态机的作用。
简单来说比如角色移动,上下左右四个方向的的移动动画一般是不一样的(有的会是一样的,但那关我什么事?),要在角色朝不同方向移动的时候播放不同的动画。
Animator Controller
在之前的博文 [从零开始的Unity 2D——Animation(帧动画)]() 中有提到如何简单的创建 Animation文件,创建时会自动的创建Animator Controller 文件,并且会自动与精灵做绑定。
如果需要手动的创建与绑定,那么需要以下步骤:
- 在资源窗口右键菜单 create -> Animator Controller 。
- 在资源窗口找到创建的Animator Controller,然后拖拽置需要绑定的精灵。也可以在精灵的inspector window中手动设置。
添加动画到 Animator Controller
这是初创建Animator Controller在Animator window中见到的样子,如果是使用拖拽素材到精灵生成的Animator 应该会多出动画的方块,本质上是编辑器自动把动画加进来了,没有什么区别。
这些方块表示控制器的状态,如果处于动画的状态那么就会播放动画。
如图,将一个名为run_back的动画添加到了Animator Controller中(拖拽到窗口中即可),橙色代表这是这个控制器的默认状态,这个时候运行游戏场景,那么一定是在播放run_back动画的。
第一个添加的动画会默认设置为默认状态,后续添加的动画方块应该都是灰色的,也可以通过右键菜单中的 set as layer default state选项将其他的动画设置为默认动画,但是默认动画只能有一个。
连线
上图 Entry 和 run_back之间有一条连线,这表示状态转换的时候,可以从Entry转换到run_back。
右键菜单中的Make Transition 可以增加状态转换的连线。
Any State
它表示任意状态,与它连线的动画,在任何状态下都可以转换过去。
Entry
Animator Controller 可以分层,这个状态就是进入该层的一个初始状态,所以默认状态都会与它连线。
当然,如果只有一层,可以将它理解为状态转换的入口。
Exit
它也与分层有关系,在状态退出这个层级,返回上一层的时候,就是从这里退出的。
状态转换的机制
状态与状态之间的连线是为了约束状态之间相互转换的规则,主要是规定是否运行从一个状态切换到另一个状态。
那么状态是如何被切换的呢?
首先需要Parameters window中新建一个变量(多个也行),它是为了生成状态转换的条件。
变量的类型有 float、int、Bool、Trigger 可选,不过Trigger我确实没有明白是个什么东西,暂时不表。
然后为Animator Controller 添加一个动画,生成状态过度连线,点击连线可以编辑状态过度的一些规则。
在condition 列表中添加之前新建的变量,然后设置状态转换的条件。
这样设置成功之后,当State == 1时,就会播放run_left的动画了。
有几个需要注意的点:
- 变量设置转换条件时,有几个选项可选,这是条件运算符
- Greater 大于
- Less 小于
- Equals 等于
- Not Equals 不等于
- 有多个变量是也可以添加多个转换条件,当所有条件都满足时,会触发状态转换
- 关于一些转换的参数
- solo 与 Mute 选项 ,solo表示只允许有一条状态转换,mute表示禁用状态转换
- Has Exit Time ,如果勾选这个选项,那么在状态发生转换时不会立即转换到下一个状态,而是会播放完成当前动画,之后再转换状态。
动画状态的Inspector window
- Motion 动画状态对应的动画文件
- Speed 动画播放的速度
- Mirror 勾选会镜像播放动画
小结
动画状态转换有两个条件:
- 满足在condition中设置的转换条件
- 当前状态允许向下一个状态转换
必须两个条件都满足的情况下动画状态才会转换
文章评论