[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()后默认根运动不执行,但是可以在这个回调中手动应用,而且还可以在应用根运动之后做出自己想要的修改.
下面是例子
我希望的的角色,比如他在攻击时是可以改变方向的,但众所周知使用了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-Animator深入系列---StateMachineBehaviour状态机脚本学习
- Unity 有限状态机(Finite State Machine)的理解 与 实现简单的可插拔(Pluggable)AI脚本对象。
- unity5, animator state machine, 无条件transition实现播放动画序列
- Unity-Animator深入系列---StateMachineBehaviour初始化时间测试
- 【Unity】脚本没有继承MonoBehaviour 如何使用Destroy
- unity, animator stateMachine立即触发状态转换
- 将Unity的脚本封装为dll文件(使用monodevelop编译器)
- 【Unity Shaders】使用Unity Render Textures实现画面特效——建立画面特效脚本系统
- 使用ajax和history.pushState无刷新改变页面URL
- Android编程——自定义View类onSaveInstanceState与onRestoreInstanceState使用方法
- Unity3d-在Unity项目中使用Mono DLL(动态链接库)
- Unity3.5的脚本编写(C#),请使用VS编写,然后用MonoDevelop调试!
- 在Unity中使用动态库(Mono DLL)
- Linux下使用Shell脚本改变当前工作路径
- 使用脚本改变树控件的行为 (转)点文本 收..
- 查看Unity使用Mono版本
- unity脚本中内部类的使用
- 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录
- unityA* 寻路算法,使用OnGUI()函数
- React-Native - 使用AppState获取App运行状态(以及监听状态改变事件)