EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

[Unity]Root Motion深度解析

直接测试

 

情况 Bake into Pose Apply Root Motion 是否勾选LoopTime 动画名称 状况 子物体(指joint_HipMaster) 父物体
01 不勾选 勾选 YES Move_Forward 位置、角度都变化(实时) 位置、角度都变化(实时) 位置、角度改变
02 不勾选 不勾选 YES Move_Forward 原地播放前进动画 位置、角度都变化(实时) 位置、角度不变
03 勾选 不勾选 YES Move_Forward 原地播放前进动画(感觉步子迈得更大) 位置、角度都变化(实时) 位置、角度不变
04 勾选 勾选 YES Move_Forward 原地播放前进动画(感觉步子迈得更大) 位置、角度都变化(实时) 位置、角度不变

 

Tips:

【子物体变动的位置和角度都是相对父物体的】

【在不断的Loop当中,位置和角度一直会重置】

 

可以发现,当勾选了全部Bake into Pose之后,无论你勾不勾选Apply Root Motion,动画始终重复播放,03和04的情况一模一样。

 

这显然不是我们期望的结果,

但像01的以跳帧的方式闪现到另一个位置,并且走路还慢慢往下陷,显然也不是我们想要的。

 

这里有个非常严重的问题,直到勾选Bake才发现。

02的情况,实际上“原地播放前进动画”指的是真的原地踏步,但原始Anim是有位移的,

换句话说,人物有跨出一条腿的动作,并实现了重心位移

但是,02是没有重心位移的,重心一直固定在原地,只看到两条腿在动。

重心不变

 

 

 

 

可以理解Bake into Pose实际上就是“烘焙成姿势”,姿势将是子物体的实时运动,不会影响父物体的位置和方向。

——这就意味着,在父物体上的碰撞体,会一直在原地不动。(灵魂出窍)

BackToPos

解决方案是不要勾选Bake into Pose,一个都不要勾选,

NoChecked

然后,碰撞体就能跟着走了。

ColiMove

由此可见这真的是一个Pose,它属于Body Transform,身体产生的动作,

RedGreen

红灯是提醒你不要勾选Bake into Pose。

 

 

这里的Bake into Pose 也就是将变换设置为Body Transform(pose)的一部分。我们可以这样去理解,如果是设置成Body Transform(pose)的话,就相当这些变换是属于动画本身的一部分,也就是说,不管设不设置Apply Root Motion,在场景中,我们都会看到模型位置或角度的变化。

(因为Body Transform不影响模型实际的位置和角度,所以这里只是纯粹的动画效果,模型的位置和角度参数值不变)

也就是和上面03和04一样的情况。

如果设置成Root Transform(即不勾选Bake into Pose),Root Transform将影响模型的实际位置和角度(前提是要设置“Apply Root Motion”,如果不设置Apply Root Motion的话,也就是说变换将不应用,场景中的模型位置或角度是不会有变化的(参数值自然也不变),就像一个行走动画,可能一直在原地行走)。

也就是02的情况。

 

 

整个变化模型相当于这样:

Mde

当你不勾选Bake烘焙的时候,你就进入了Root的选择项。

 

开始→动画1→动画2,当动画1和动画2都Bake了的话,

①Apply Root Motion,父物体完全不影响,第二个动画会返回从原点重新开始。

②No Apply Root Motion,父物体完全不影响,第二个动画会返回从原点重新开始。

当动画1Bake了,动画2不Bake的时候,

③Apply Root Motion,出现了【Apply Root Motion的第二个作用】,待会儿再解释,先给张图体会体会:

GANGTI

Apply Root Motion的第二个作用是在动画结束后,将Body Transform中的变化应用到模型(注意,这里是结束的时候才应用,也就是说动画的时候,模型的position、rorate等参数是不变的,当动画结束之后,开始新的动画之前才会改变,注意这里跟前面提到的Root Transform的区别)

④No Apply Root Motion,父物体完全不影响,第二个动画会返回从原点重新开始。

 

 

情况③把Bake的动画2拿走,那么你将不会看到父级Transform发生变化 :

NOchange

【Apply Root Motion的第二个作用】发生的前提是,动画1Bake了,动画2不Bake,并且勾选Apply。

 

实际上,你要是动画1不Bake就和表格01的情况一样的(父级实时变化)。

 

 

典型应用:

不烘焙任何Pose,只使用Apply Root Motion。(这是用得最多的)

 

 

扩展阅读:

[1] [Unity]从零开始认识C#脚本——以第三人称控制器为例

 

参考文档:

[1] Unity基础(23)-动画系统

[2] Root Motion深度解析[Unity]

This article was last edited at 2020-04-05 18:55:34

* *