动画系统 关于动画系统的根运动RootMotion
2014-12-12 16:43
453 查看
【原文参考】/article/3583167.html
动画将控制RootBone对象的坐标、旋转、比例等,不合适的称为根运动吧
此脚本,就是将RootBone对象的坐标、旋转、比例等映射到父对象上,产生根运动的效果,不会出现感觉滑帧的情况出现
legacy参考脚本:
mecanim参考程序:
动画将控制RootBone对象的坐标、旋转、比例等,不合适的称为根运动吧
此脚本,就是将RootBone对象的坐标、旋转、比例等映射到父对象上,产生根运动的效果,不会出现感觉滑帧的情况出现
legacy参考脚本:
using UnityEngine; using System.Collections; public class ApplyRootMotion : MonoBehaviour { //-- Root Motion 控制变量 public Transform m_rootBone; Vector3 m_lastRootPos; Vector3 m_rootMotion; int m_lastAnimTime; Vector3 m_lastRootRot; Vector3 m_rootRot; void Start () { //-- 从SkinnedMeshRenderer中读取Root Bone SkinnedMeshRenderer skinMesh = this.gameObject.GetComponentInChildren<SkinnedMeshRenderer>(); m_rootBone = skinMesh.rootBone; //-- 变量初始化 m_rootMotion = Vector3.zero; m_lastRootPos = m_rootBone.localPosition; m_rootRot = Vector3.zero; m_lastRootRot = m_rootBone.localRotation.eulerAngles; m_lastAnimTime = 0; } void Update () { //-- Apply Root Motion Vector3 nextPos = this.transform.position + m_rootMotion; this.transform.position = nextPos; this.transform.rotation = Quaternion.Euler(this.transform.rotation.eulerAngles + m_rootRot); //-- 测试代码:更新摄像机 Camera.main.transform.LookAt(this.transform); } void LateUpdate() { AnimationState animState = this.animation["walking"]; print((int)animState.normalizedTime +" : "+m_lastAnimTime); if ((int)animState.normalizedTime > m_lastAnimTime) { //-- 动画循环处理 m_lastRootPos = m_rootBone.localPosition; print(m_lastRootPos); m_lastRootRot = m_rootBone.localRotation.eulerAngles; } else { //-- 计算当前帧的Root Motion Vector3 rootPos = m_rootBone.localPosition; m_rootMotion = rootPos - m_lastRootPos; m_lastRootPos = rootPos; Vector3 rootRot = m_rootBone.localRotation.eulerAngles; m_rootRot = rootRot - m_lastRootRot; m_lastRootRot = rootRot; } m_rootBone.localPosition = Vector3.zero; m_rootBone.localRotation = Quaternion.Euler(Vector3.zero); m_lastAnimTime = (int)animState.normalizedTime; } }
mecanim参考程序:
using UnityEngine; using System.Collections; public class AnimatorTest_2 : MonoBehaviour { public Transform _rortBone; private Vector3 _startRootRot,_startRootRot2; private Vector3 _motionRootRot; private Animator _animator; private AnimatorStateInfo _animStateInfo; void Start() { _animator = GetComponent<Animator>(); _startRootRot2 = _startRootRot = _rortBone.rotation.eulerAngles; _motionRootRot = Vector3.zero; } void Update() { _animStateInfo = _animator.GetCurrentAnimatorStateInfo(0); AnimatorRecover(); if(_animStateInfo.IsName("Base Layer.Idle")) { if(Input.GetKeyDown(KeyCode.A)) { _animator.SetBool("IdleToLeft",true); } else if(Input.GetKeyDown(KeyCode.D)) { _animator.SetBool("IdleToRight",true); } } if(_animStateInfo.IsName("Base Layer.TurnLeft") || _animStateInfo.IsName("Base Layer.TurnRight")) { transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles + _motionRootRot) ; } } void LateUpdate() { if(_animStateInfo.IsName("Base Layer.TurnLeft") || _animStateInfo.IsName("Base Layer.TurnRight")) { print(_animStateInfo.normalizedTime); if(_animStateInfo.normalizedTime < 0.98f) { Vector3 _rootPos = _rortBone.localRotation.eulerAngles; _motionRootRot = _rootPos - _startRootRot; _startRootRot = _rootPos; } else { _motionRootRot = Vector3.zero; _startRootRot = _startRootRot2; } _rortBone.localRotation = Quaternion.Euler(Vector3.zero); } } void AnimatorRecover() { if(!_animStateInfo.IsName("Base Layer.Idle")) { _animator.SetBool("IdleToRight",false); _animator.SetBool("IdleToLeft",false); } } }
相关文章推荐
- 关于OS X系统root账号的激活及密码更改
- RootMotionComputer 根运动计算机
- 关于linus系统切换root
- 动画Root Motion的脚本处理
- 关于利用css动画制作骰子运动
- Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动
- 关于Windows系统MySQL5.6数据库root用户密码重置的注意事项
- UIView封装动画--iOS 利用系统提供方法来做弹性运动
- Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系
- 关于Unity中旧版动画系统的使用
- 关于linux系统无法启动,提示Give root password for maintenace的解决办法
- unity3d 让角色运动之使用脚本(另一个方法为勾选Apply Root motion)
- 关于未完全Root的Android系统如何彻底ROOT
- 【Unity】Unity 5.0 中酷炫的新动画功能详—— StateMachineBehaviour、StateMachineTransitions和RootMotionAuthoring
- 关于Unity5版本动画系统中anystate跳转重复播放当前动画解决方案
- 关于Ubuntu桌面系统su root时认证失败的问题
- 关于Android系统ROM的debug-root模式说明
- 关于Unity5版本动画系统中anystate跳转重复播放当前动画解决方案
- 关于virtualBox中最小化安装CentOS7系统,更改httpd.conf中的DocumentRoot之后访问出现Forbidden的问题
- 关于Unity中新版动画系统的使用