From 0a4dd643234284db73735f78ece9c209b80a72d6 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 3 Sep 2021 09:45:03 +0800 Subject: *misc --- Assets/Scripts/Unit/UnitRootMotion.cs | 56 ++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'Assets/Scripts/Unit/UnitRootMotion.cs') diff --git a/Assets/Scripts/Unit/UnitRootMotion.cs b/Assets/Scripts/Unit/UnitRootMotion.cs index c920010a..5a17da61 100644 --- a/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Assets/Scripts/Unit/UnitRootMotion.cs @@ -11,15 +11,21 @@ public class UnitRootMotion : UnitComponent { RootMotionData m_RootMotionData; - private float m_PrevNormalTime; + 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() @@ -63,25 +69,47 @@ public class UnitRootMotion : UnitComponent #else - public override void OnUpdate() + public override void OnUpdate() { base.OnUpdate(); } + public void OnAnimationChange() + { + m_PrevAnimationData = null; + } + public void UpdateRootMotion() { - // 因为Unti被旋转了90度,所以这里的deltaPosition的forward是x方向了 - Vector3 dest = m_Owner.unitAnimation.animator.deltaPosition; - dest.z = 0; - - var state = m_Owner.unitAnimation.layers[0].stateInfo; - if(state.IsTag("IgnoreY")) - { - dest.y = 0; - } - - //m_Owner.transform.position += RootMotionUtility.ExchangeXZ(dest); // 不需要exchangeXZ - m_Owner.transform.position += dest; + 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 -- cgit v1.1-26-g67d0