摘要:【长文预警,建议先收藏】有了模型和多个动画以后,在Unity中如何控制它们的播放和切换呢?本文带你一站式解析Unity的Animator模块。
大话Unity,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。
大智:“小新,还记得Unity的动画来源有哪些么?”
小新:“有Unity中制作和外部导入两种,哦对!还可以用代码写动画,不过我不会,嘿嘿”
大智:“没错,前两天我们学习的其实主要是Animation Clip的内容,也就是一个物体对应的一段动画,是整个动画系统的基本元素。今天我们要着重学习一下Animator。如果把Animation Clip比作是一段视频的话,那么Animator就是一个视频播放器,用来控制多段视频的播放、切换等等。”
Animator组件
想要在一个物体上播放动画,需要在这个物体上添加Animator组件。
Animator中有一个很重要的属性是Controller,这个属性引用了一种叫Animator Controller的资源,这种资源以文件的形式存储在工程中,文件内存储了动画的各种状态以及状态之间的切换规则。本文后半部分会细讲。
Avatar 设置使用的骨骼节点映射。
Apply Root Motion 应用根节点运动。如果不启用,动画播放时根节点会保持在原地,需要通过脚本控制物体的移动。如果启用,如果动画中有运动,动画中的运动会换算到根节点中,根节点会发生运动。(通常用于人物/动物的运动动画)
Update Mode 设置Animator更新的时机以及timescale的设置。
- Normal Animator按正常的方式更新(随着Update调用更新,timescale减小时,动画播放也会减慢,timescale的具体含义和用法后续会详解)
- Animate Physics Animator会按照物理系统的频率更新(根据FixedUpdate调用更新,后续会详解),适用于物理交互,例如角色加上了物理属性可以推动周围的其他物体。
- Unscaled Time 根据Update调用更新,无视timescale。一般用于UI界面,当你使用timescale暂停游戏时,界面保持正常动画。
Culling Mode 裁剪模式
- Always Animate 动画一直运行,即使物体在屏幕外被裁剪掉并没有渲染
- Cull Update Transforms 当物体不可见时,禁用Retarget、IK、Transforms的更新(后续动画进阶模块会细讲)
- Cull Completely 当物体不可见时,完全禁用动画
Animator Controller
Animator Controller是Animator组件必须的资源,这种资源以文件的形式存储在工程中,文件内存储了动画的各种状态以及状态之间的切换规则。
通常一个物体上有不止一段动画,使用Animator Controller可以很容易地管理各段动画以及动画之间的切换。比如角色身上有走、跑、跳、蹲的动画,使用Animator Controller可以很容易管理它们。不过,即使只有一段动画,仍然需要给动画物体添加Animator组件才能播放动画。
大智之前讲过可以使用PlayableAPI绕过Animator Controller来播放动画,感兴趣的话可以去看一下
Animator Controller中使用了一种叫State Machine(状态机)的技术来管理状态以及状态之间的切换。
StateMachine 状态机
状态机由State(状态)和Transition(转换)组成。State代表一个状态,在Animator Controller中一个State可以包含一段动画、一个子状态机或一个混合树(