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; Dictionary m_RootMotionDic = new Dictionary(); private float m_PrevNormalTime; public override void Initialize() { base.Initialize(); } #if false // 用自定义root motion 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 UpdateRootMotion() { Vector3 dest = m_Owner.unitAnimation.animator.deltaPosition; dest.x = 0; //限制x轴始终在x=0 var state = m_Owner.unitAnimation.layers[0].stateInfo; if(state.IsTag("IgnoreY")) { dest.y = 0; } m_Owner.transform.position += dest; } #endif }