欢迎光临散文网 会员登陆 & 注册

Unity笔记——用代码获取Animator动画的移动量

2023-08-15 21:34 作者:黑白色的枫  | 我要投稿

在Animator组件中,有一个 Apply Root Motion 选项,勾上它以后,在播放动画时,游戏对象就会真的根据动画的移动幅度来移动,动画一脚迈半米,Animator 所在的 gameObject 也会向前移动半米。

听起来似乎很美好,但是如果播放动画的对象是子物体,那么 Animator 也仅仅会驱动子物体进行移动,父物体则不会受到影响的停留在原地。

遇到这种情况,我们就需要通过代码来获取动画的移动量,再把这个移动量传递给父物体,驱动父物体进行移动。

首先我们要再 Animator 所在的对象上新建一个脚本,命名为 RootMotionControl ,命名仅供参考,并声明 OnAnimatorMove 函数它是MonoBehaviour 的生命周期函数之一,在处理完状态机和动画后的每一帧中调用。

deltaPosition 表示这一帧动画移动的量,再得到这个量以后,我们就可以向上传递,SendMessageUpwards 会向自己同级和自己父级的 MonoBehaviour 调用 OnUpdateRM 函数,OnUpdateRM 可以根据自己的需求更改,第二个参数为 object 类型,对应的我们的OnUpdateRM 函数的参数也要是object类型进行接收。

SendMessageUpwards 函数会遍历所有的父级对象,性能消耗比较大,这里推荐使用委托或者单例等方式进行处理。

这是黑魂复刻中的代码,CheckState 函数判断了当前是否处于 attack 动画层的 attack1hC动画,为 true 的时候就将移动量记录下来,并在 FixedUpdate 中处理移动的时候进行累加,在使用完后赋值为Vector3.zero进行置空。

这样,就可以在 Animator 没有启用 Root Motion是时候,让角色也可以根据动画实际的移动量来移动。


参考视频

参考文档

Unity官方文档

Unity笔记——用代码获取Animator动画的移动量的评论 (共 条)

分享到微博请遵守国家法律