一、根运动
在学习根运动前需要了解两个名词:
- 身体变换:身体变换是角色的质心。它用于 Mecanim 的重定向引擎,并提供最稳定的移位模型。身体方向是相对于 Avatar T 形姿势的下身和上身方向的平均值。身体变换和方向存储在动画剪辑中(使用 Avatar 中设置的肌肉定义)。它们是动画剪辑中存储的唯一世界空间曲线。所有其他:肌肉曲线和 IK(反向动力学)目标(手和脚)都是相对于身体变换进行存储的。
- 根变换:根变换是身体变换在 Y 平面上的投影,并在运行时计算。在每一帧都会计算根变换的变化。变换的此变化随后应用于游戏对象以使其移动。
以上出自Unity官方文档,看完还是一脸懵逼。。。举个简单的例子来说:假如现在角色有向前走动的动画,如果是身体变换,就是角色的模型在走动,但角色在世界中的位置并没有变化;如果是根变换,那么角色在模型上的移动就会反映到根节点上,也就是说角色不仅模型在走动,在世界上的位置也在移动。
可以看到,上方的角色因为没有采用根变换,其位置始终没有改变,只是在重复播放模型的动画。
1.1 开启或关闭根运动
那么如何开启或关闭根运动呢?这里涉及到两个选项。
首先在动画剪辑面板上,如果动画能够影响角色的位置或旋转,一般会有如下选项
这里面有个属性叫做「Bake Into Pose」,意思是将方向保持在身体变换上。也就是说,如果勾选这个属性,就是将根变换存放在动画中,即使用身体变换。
除此之外,还有在角色身上挂载的「Animator」组件中,有个「Apply Root Motion」选项。只有在开启这个选项时,根变换才会应用到模型身上。
这两个选项不同的排列组合也会对动画产生不同的影响。
-
「Bake Into Pose」开启,「Apply Root Motion」关闭或开启
只要「Bake Into Pose」选项开启,动画就使用了身体变换。就会出现如下效果
-
「Bake Into Pose」关闭,「Apply Root Motion」开启
此时角色会正常移动
-
「Bake Into Pose」关闭,「Apply Root Motion」关闭
此时因为使用了根变换,但不允许应用,所以角色会原地踏步
1.2 通过脚本控制根运动的发生
在某些情况下,我们希望一部分状态启用根运动,另一部分关闭根运动。此时就可以使用脚本控制根运动的发生。
在脚本中添加OnAnimatorMove()
生命周期函数,就会发现「Animator」组件的「Apply Root Motion」变为了「Handled By Script」。意味着根运动已被脚本接管
接下来我们只需要在OnAnimatorMove()
中实现我们的控制逻辑即可。
比如我们希望由根运动控制角色的位置。但在跳跃时,由于角色的根节点位置只存在Y轴方向的变换,就会造成只能原地起跳的问题。这种情况下就可以在这个函数中对当前状态进行判断。如果当前是跳跃状态,就直接通过代码控制角色的位置。
private void OnAnimatorMove()
{
// 如果当前状态的标签不是"NoRootMotion",则由根运动控制角色位置
if (!_animator.