【虚幻】用动画曲线来驱动角色运动,实现最完美的运动方式——伪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值。
完结,散花