【虚幻】用动画曲线来驱动角色运动,实现最完美的运动方式——伪Root Motion

转载请注明出处:http://www.cnblogs.com/shamoyuu/p/counterfeit_root_motion.html

 

一、角色运动分类

在虚幻或Unity3D中,角色的运动一般有2种方法来驱动:

1是直接(或间接)修改角色坐标,然后计算上一帧和这一帧之间的距离差来算出速度,然后用速度来选择播放哪个动画(0=idle,300=walk,600=run)。

2是Root Motion,由动画驱动。在动画师做的动画中,角色骨骼的root节点就自带位移,然后游戏引擎获取到这些位移,以此来改变角色在游戏中的位置。

 

二、各自优缺点

1优点是实现简单,可控性高,对联机的支持足够好。缺点就是简单,如果是步履蹒跚的走法,因为移动速度不恒定,会滑步(常见丧尸、老人之类的慢走)。

2优点是完全不会滑步,动画里怎么移动,游戏里就会怎么移动。缺点就是实现复杂,可控性差,对联机支持不够(无法预测下一帧时角色的位置),网络差的时候会很糟糕。

 

三、动画曲线驱动的伪Root Motion

这种方式的移动还是交给代码(MovementComponent),但是它的移动速度却由动画曲线来控制,这样就可以很好地整合前面两种移动方式的优点,也避免了一些它们的缺点。

可以看到这两个动画(一个步履蹒跚,速度时快时慢,而且左右摇晃,另一个转来转去),虽然它们不是Root Motion,但是无论是移动还是旋转,却都没有丝毫滑步现象。

 

实现起来其实很简单

首先要把Root Motion中Root的位移旋转等信息转换成曲线,这里使用一个插件Root Motion Extractor,去年的时候Epic免费送过,没有的话就自己想办法了。

转换很简单,把SourceFolder和TargetFolder选一下,然后所有选项都打钩,然后点转换就好了,唯一的两个小问题就是,首先这个动画不能是曲线动画(得是3dmax里做的那种常规的动画),其次Root Motion的动画资源里要勾选“启用根运动”。

这里就是转换好之后的InPlace动画资源,可以看到里面有很多的曲线,看名字就应该知道都是干啥的了。

需要注意的是,这里转换完成之后,最好保存重启一下工程,不然曲线数据可能获取不到。

 

然后这样就可以获取到当前动画曲线的float值了,最后就是简单把它放到Tick里

 

在每一帧获取曲线的值,然后设置对应的属性就好了。

图里的-95和270是网格默认的旋转和位置。

 

最后,就是修改动画的逻辑,动画的不能再由Speed来决定,而是应该交给按键axis值。

 

完结,散花

posted @ 2021-10-30 15:54  静茹♂鱼  阅读(1257)  评论(0编辑  收藏  举报