动画状态机的定义
Unity中的动画状态机(Animator Controller)是用于定义和管理角色或对象动画状态之间转换的工具。它允许动画师和开发者设计复杂的动画逻辑;
例如角色的行走、跑步、跳跃、攻击等动作,以及其他动作之间的平滑过渡,都需要动画状态机来控制。
动画状态机
Animator Controller 动画控制器
创建一个动画控制器:
找到Assest ------> 右键点击Create -------> Animation -------> Animator Controller
创建好的动画控制器会显示这个三个元素,这三个元素是动画状态机的基本组成部分
- Any State:这个是一个特殊的状态,它允许从任何其他状态过渡,在Animator Controller的状态机中,你可以从这个状态创建过度到其他的任何状态,无论它们是否在同一个层级或者不同的层级
- Entry:这个是状态机的入口点,当Animator Controller开始运行的时候,它会从这个状态开始。通常,会将这个状态设置为动画播放的起始点,或者作为其他状态的过渡态
- Exit:这个是状态机的出口点,当Animator Controller结束运行的时候,它会达到这个状态,在大多数情况下,Exit状态用于处理动画播放完成后的清理工作,或者作为其他状态的过渡终点
这里实现了一个从 idle(待机)到run(跑)之间的转换
- 这些选项是对动画状态进行操作的菜单命令,当你在Animator窗口中右键点击一个动画状态的时候,会出现这个菜单
- Make Transition:创建一个从当前状态到另一个状态的过渡,这会允许你定义动画如何在不同状态之间进行切换
- Set as Layer Default State:将当前状态设置为所在层的默认状态,这意味着Animator Controller的该层被激活时,将从这个状态开始播放动画
- Copy:复制当前的状态,这会创建一个与当前状态完全相同的新状态
- Create new BlendTree in State:在当前状态中创建一个新的Blend Tree,Blend Tree是一种特殊类型的动画状态,它允许你混合多个动画剪辑,通常用于创建平滑的动画过渡
- Delete:删除当前状态,这会从Animator Controller 中移除这个状态,以及所有指向或来自这个状态的过渡
Create State:创建一个新状态:
- Empty:创建一个空状态,这个状态没有任何关联的动画剪辑,可以作为过渡的中间点或用于创建自定义的动画逻辑
- From Selected:从当前选中的动画剪辑创建一个新状态,这个状态会直接关联到你选中的动画剪辑
- From New Blend Tree:从一个新的Blend Tree创建一个新状态。Blend Tree允许你混合多个动画剪辑,通常用于创建平滑的动画过渡
Create Sub-State Machine:创建一个子状态机,子状态机是嵌套在另一个状态机内部的状态机,用于组织重用复杂的动画逻辑
Paste:粘贴之前复制或剪切的状态或子状态机
Copy current StateMachine:复制当前的状态机,这允许你创建一个现有的状态机的副本,可以对其进行修改而不影响原始状态
参数设置界面
Parameters
这是Animator Controller中的一个层,参数是用于控制动画逻辑的变量,可以是不同的类型,里面有浮点数 Float、整数 Int、布尔值 Bool、还有一个触发器Trigger(这是一种特殊的布尔值,它在被设置为真的时候触发一次,然后自动重置为假。通常被设置为一次性事件)
Base Layer
所有的动画状态和过渡都包含在这里,可以将这个名字进行重命名
Animation 动画
创建一个动画:
找到Assest ------> 右键点击Create -------> Animation -------> Animation
在这个Animation里面,我们可以将创建好的Animation拖拽到我们需要绑定的物体上,就会直接生成一个动画控制器,并且这个动画控制器和我们的物体也是绑定的;也可以将我们新创建好的动画拖拽到动画控制器的面板上,与之进行绑定
我们可以在Animation窗口中实现:
- 创建动画剪辑:将动画的每帧拖拽到面板上,在时间轴上设置关键帧,定义动画的开始和结束状态
- 预览动画:使用播放控制按钮预览动画效果,调整关键帧和属性值,直到动画达到预期的效果
- Samples:指的是每秒从采样点数,这个设置决定了动画在一秒钟内被分成了多少个的采样点,从而影响动画;可以理解为每秒有多少帧的动画,类似于那种连环画
Inspector面板
Controller:这里显示的是Animator组件所使用的Animator Controller,可以选择进行绑定
Avatar:Avatar指的是动画数据的容器,它包含了骨骼结构和动画剪辑
Apply Root Motion:这个选项决定了是否将动画的根运动(角色的移动)来应用到游戏对象上面
Update Mode:决定了Animator组件更新动画的状态
- Normal:动画状态的更新与游戏的帧率同步,这意味着动画的更新频率会随着游戏帧率的变化而变化
- Animate Physics:动画状态的更新与物理更新同步,通常用于需要与物理模拟紧密同步的动画
- Unscaled Time:动画状态的更新与时间无关,即使游戏暂停或时间缩放的改变,动画也会继续正常速度进行播放,这种比较适用于UI动画
Culling Mode:决定了在游戏对象不可见的时候,动画是否继续播放
- Alawys Animate:即使在屏幕外也会继续持续播放
- Cull Update Transform:停止更新视野外的游戏的动画,但是会仍然更新其Transform,这意味这游戏对象位置和方向会保持更新,但动画本身不会播放,直到游戏对象重新进入摄像机视野
- Cull Completely:当游戏对象不在摄像机视野内,动画和Transform更新都会被停止,这样可以节省性能,当游戏对象每次重新进入视野的时候,可能会出现位置或动画的跳跃
Animator Override Controller
Unity中的一个功能,它允许你在不修改原始Animator Controller的情况下,重写或添加新的动画状态和过渡。这在需要为不同的游戏对象或场景微调动画行为时非常有用,而不需要创建多个Animator Controller的变体
用法
-
覆盖现有状态:修改原始Animator Controller中的动画状态,例如更改动画剪辑或调整过渡条件。
-
添加新状态:在不改变原始Animator Controller的情况下,添加全新的动画状态。
-
调整参数:修改或添加新的参数,这些参数可以用于控制动画过渡和状态。
-
优化性能:通过只加载必要的动画资源,减少内存占用和提高加载速度。
使用情况
- 多角色动画:当你有多个角色使用相同的动画逻辑,但需要不同的动画资源时。
- 场景特定动画:为特定场景或环境调整动画,而不影响其他场景。
- 动态动画调整:根据游戏运行时的条件动态调整动画。
通过代码控制改变Animator Controller的行为
获取Animator组件
Animator animator = GetComponent<Animator>();
设置参数
animator.SetBool("IsRunning", true); // 设置布尔参数
animator.SetFloat("Speed", 5.0f); // 设置浮点数参数
animator.SetInteger("Health", 100); // 设置整数参数
触发过渡
animator.SetTrigger("Jump"); // 触发一个触发器
播放特定的动画状态
animator.Play("Run"); // 播放名为"Run"的动画状态
停止动画
animator.Stop(); // 停止当前播放的动画
检查当前状态
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.IsName("Idle"))
{// 当前状态是Idle
}
我们也可以在代码里动态创建和配置Animator Controller,但通常都是在Unity编译器里面进行创建