您的位置:首页 > 移动开发 > Unity3D

[Unity Tips]在脚本中使用MonoBehavior.OnAnimatorMove()和StateMachineBehavior.OnStateMove()改变根运动

2017-10-28 22:55 567 查看
最近在写自己做的格斗类小游戏时遇到了,一些问题,我在Animator上使用了ApllyRootMotion来控制角色的模型做出3dsmax中配置好的动画的位移和旋转,可是有一个问题,

我希望的的角色,比如他在攻击时是可以改变方向的,但众所周知使用了ApplyRootMotion之后在脚本中给Transform赋值是没有用的,因为我曾在Unity Manual里看到过这样一句话:

“角色的Transform将不能通过脚本来直接赋值,而是通过动画的运动的来改变的” ,

所以当时瞬间就绝望了,通过多方查阅资料所得甚少,最后关注到MonoBehavior.OnAnimatorMove()这个Unity回调函数,它的解释是”用于修改根运动处理动画移动的回调。在该状态机和动画已经被求值之后,但在OnAnimatorIK之前,该回调将在每帧调用。”

抱着试一试的心态我在脚本中使用了这个函数,发现角色转是转了,当时根运动又不执行了,当把OnAnimatorMove()去掉时跟运动却又能执行了,所以当时就在思考是不是漏了什么,查找到Unity Scripting的Animator类里发现了Animator.ApplyBuiltinRootMotion ()”应用默认根运动”这个函数,万能的Unity终究没有让我失望.

在OnAnimatorMove()中使用Animator.ApplyBuiltinRootMotion ()后再修改Transform根运动和我想要的旋转都能实现.

所以便想通了为什么在Update中修改Transform不会生效,也许是根运动的执行会在所有Update之后,所以覆盖了脚本的修改,而实现了OnAnimatorMove()后默认根运动不执行,但是可以在这个回调中手动应用,而且还可以在应用根运动之后做出自己想要的修改.

下面是例子

//OnStateMove是StateMachineBehavior的回调函数
//它与MonoBehavior的OnAnimatorMove回调时间相近,会在OnAnimatorMove之后立即调用
public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
base.OnStateMove(animator, stateInfo, layerIndex);
animator.ApplyBuiltinRootMotion();
transform.forward = CameraForward;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity