using System.Collections; using System.Collections.Generic; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif // 同步root motion到角色根节点 [DisallowMultipleComponent] public class UnitRootMotion : UnitComponent { RootMotionData m_RootMotionData; float m_PrevFrame; AnimationData m_PrevAnimationData; public override void Initialize() { base.Initialize(); m_PrevFrame = 0; m_PrevAnimationData = null; } #if false // 用自定义root motion private float m_PrevNormalTime; Dictionary m_RootMotionDic = new Dictionary(); public void Reset() { m_PrevNormalTime = 0; } public override void OnUpdate() { base.OnUpdate(); var state = m_Owner.unitAnimation.curState; float playbackTime = m_Owner.unitAnimation.playbackTime; var rootMotion = m_RootMotionDic[state]; float normalTime = (playbackTime % rootMotion.animationLength) / rootMotion.animationLength; if (m_PrevNormalTime > normalTime) m_PrevNormalTime = 0; m_Owner.transform.position += rootMotion.GetRootMotionDistance(m_PrevNormalTime, normalTime); m_PrevNormalTime = normalTime; } public void SetUpRootMotion(string unitFolder, UnitActionData actions) { if (actions == null) return; foreach (var action in actions.actions) { #if UNITY_EDITOR AnimationClip clip = action.Value; string name = clip.name; string path = unitFolder + "RootMotion/" + name + ".asset"; RootMotionData data = AssetDatabase.LoadAssetAtPath(path); m_RootMotionDic.Add(action.Key, data); #endif } } #else public override void OnUpdate() { base.OnUpdate(); } public void OnAnimationChange() { m_PrevAnimationData = null; } public void UpdateRootMotion() { bool overrideRootMotion = m_Owner.unitAnimation.baseLayer.animationData.overrideRootMotion; if(overrideRootMotion) { var baseLayer = m_Owner.unitAnimation.baseLayer; var rmData = m_Owner.unitAnimation.baseLayer.animationData.rootMotionOverrideData; float frame = baseLayer.playbackNormalizedTime * baseLayer.clipInfo.clip.length * TimelineEventProxy.FPS; var animData = m_Owner.unitAnimation.baseLayer.animationData; if(animData != m_PrevAnimationData) { m_PrevAnimationData = animData; m_PrevFrame = frame; } Vector3 dest = rmData.GetRootMotionDistance(m_PrevFrame, frame); m_Owner.transform.position += dest; m_PrevFrame = frame; } else { // 因为Unti被旋转了90度,所以这里的deltaPosition的forward是x方向了 Vector3 dest = m_Owner.unitAnimation.animator.deltaPosition; dest.z = 0; var state = m_Owner.unitAnimation.baseLayer.stateInfo; if (state.IsTag("IgnoreY")) { dest.y = 0; } //m_Owner.transform.position += RootMotionUtility.ExchangeXZ(dest); // 不需要exchangeXZ m_Owner.transform.position += dest; } } #endif }