【博客节选】再谈Unity 的 root motion
节选自 【Unity实战笔记】第二十三· root motion变更方向攻击 (OnStateMove + rootmotion + rigidbody 使用的一些问题)
小伙伴们应该对root motion非常困惑,包括那个bake into pose。
当xz bake into pose后,角色攻击动画与父节点产生偏移,动画结束后,模型还会瞬移归位。
如何理解?先看一下这位看过Mecanim源码的人的介绍:
根节点运动(Root Motion)
- 这里的根节点运动并不是一般意义上的“动画中的根节点的运动”,而是Mecanim动画系统处理根节点运动的一些列相关功能,以下都直接称之为RootMotion,而Mecanim一般称原本动画中对根节点的运动为< Root Transform >;
- Mecanim有很具有特色的RootMotion处理功能,这里首先要提出两个概念:
-Scene Root
,模型文件中骨骼中真正的根节点,一般名称就是Scene Root,
-Model Root
,是Mecanim系统中模型语义上的中心节点;- 在非人形动画(Generic)中,默认没有Model Root,开发者可以指定任何节点为Model Root,而人形动画(Humanoid)中,Model Root不是任何一根具体的骨骼,而固定是人形骨骼的重心,在Unity给出的API中,根据导入配置选项差别,也称为Body或者Center of Mass;
一旦骨骼对象拥有Model Root,其上的动画就会有RootMotion的语义,其详细意义是将Model Root在模型空间内的变换映射至Scene Root上
,换句话说,RootMotion可以在原动画中不包含RootTransform时在Runtime时根据设置计算得到RootTransform;RootMotion为开发者提供了两种处理计算得到的RootTransform的方法,一种是保留根变换,一种将根变换烘焙进Model Root中
,也就是Unity官网解释的RootTransform
和BodyTransform
方法;具体使用方法取决于Animator和AnimationClip的设置;应用RootTransform,也就是在Animator处开启Apply Root Motion,计算得到的RootTransform就会实际变换Scene Root,而应用BodyTransform,也就是选择对应Bake Into Pose,计算得到的RootTransform就会只变换Model Root,Scene Root会保持不变
;
根节点运动(Root Motion)逻辑控制方案- Unity提供了一套代码支持逻辑管理RootMotion而不是让Animator直接管理的需求,在Animator组件的同级任意组件中实现OnAnimatorMove()回调接口即可;
- 实现接口后Animator原本的RootMotion就不会生效,但是RootMotion计算得到结果会分别保存在Animator.rootPosition,Animator.rootRotation,Animator. deltaPosition, Animator. deltaRotation中,代码中根据需求使用;
- ① Scene Root,对应 RootTransform
- ② Model Root,对应 BodyTransform
如果不应用root motion,不bake into pose,就是一个原地动画,①不动和②也不动。
如果不应用root motion,bake into pose,①不动,②动。
如果应用root motion,bake into pose,①不动,②动。
如果应用root motion,不bake into pose,那就是②跟随①运动。
如下(出自我 第十一篇文章《动画基础》7.6.2 节):