From 0a4dd643234284db73735f78ece9c209b80a72d6 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 3 Sep 2021 09:45:03 +0800 Subject: *misc --- .../Unit/Components/UnitAnimation/PCAnimation.cs | 3 +- .../Unit/Components/UnitAnimation/UnitAnimation.cs | 32 ++++++++++--- Assets/Scripts/Unit/Components/UnitCollider.cs | 2 +- Assets/Scripts/Unit/UnitRootMotion.cs | 56 ++++++++++++++++------ 4 files changed, 71 insertions(+), 22 deletions(-) (limited to 'Assets/Scripts/Unit') diff --git a/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs b/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs index dbd4dd49..8d737277 100644 --- a/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs +++ b/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs @@ -68,7 +68,7 @@ public class PCAnimation : UnitAnimation private UnitActionData m_ActionData; - public bool applyRootMotion { get; set; }// 动态设置root motion + public bool applyRootMotion { get; set; } public bool applyRootCurve { get; set; } // 程序生成的root motion public bool updateAnimationAuto { get; private set; } // 自动更新动画 @@ -129,6 +129,7 @@ public class PCAnimation : UnitAnimation { if (!applyRootMotion) return; + m_Owner.unitRootMotion.UpdateRootMotion(); } diff --git a/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs b/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs index a9c50ac3..db81a2ed 100644 --- a/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs +++ b/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs @@ -24,7 +24,7 @@ public class AnimatorLayerInfo { get { - AnimatorClipInfo[] clipInfos = clipInfo; + AnimatorClipInfo[] clipInfos = clipsInfo; if (clipInfos == null || clipInfos.Length == 0) return null; var clip = clipInfos[0]; //选第一个 @@ -57,7 +57,7 @@ public class AnimatorLayerInfo private int preStateHash = -1; // 当前正在播放和融合的片段信息 - public AnimatorClipInfo[] clipInfo + public AnimatorClipInfo[] clipsInfo { get { @@ -78,6 +78,14 @@ public class AnimatorLayerInfo } } + public AnimatorClipInfo clipInfo + { + get + { + return clipsInfo[0]; + } + } + public int stateHash { get @@ -91,7 +99,7 @@ public class AnimatorLayerInfo { get { - return playbackNormalizedTime * clipInfo[0].clip.length; + return playbackNormalizedTime * clipInfo.clip.length; } } @@ -116,7 +124,7 @@ public class AnimatorLayerInfo //if (state.IsName("Attack0")) //{ // Debug.Log("normalizedTime=" + state.normalizedTime); - // Debug.Log("playbackTimeInSeconds=" + state.normalizedTime * clipInfo[0].clip.length); + // Debug.Log("playbackTimeInSeconds=" + state.normalizedTime * clipInfo.clip.length); //} return state.normalizedTime % 1f; } @@ -258,7 +266,13 @@ public class UnitAnimation : UnitComponent if (layer == null) return; layer.OnPlay(animState, normalizedTime); - } + + UnitRootMotion rm = m_Owner.GetComponent(); + if(rm) + { + rm.OnAnimationChange(); + } + } public void CrossFade(string animState, float normalizedTransitionDuration, int layerIndex = 0, float normalizedTimeOffset = float.NegativeInfinity, float normalizedTransitionTime = 0.0f) { @@ -266,6 +280,12 @@ public class UnitAnimation : UnitComponent if (layer == null) return; layer.OnCrossFade(animState, normalizedTransitionDuration, normalizedTimeOffset, normalizedTransitionTime); - } + + UnitRootMotion rm = m_Owner.GetComponent(); + if (rm) + { + rm.OnAnimationChange(); + } + } } diff --git a/Assets/Scripts/Unit/Components/UnitCollider.cs b/Assets/Scripts/Unit/Components/UnitCollider.cs index 63e1ff7f..797eb480 100644 --- a/Assets/Scripts/Unit/Components/UnitCollider.cs +++ b/Assets/Scripts/Unit/Components/UnitCollider.cs @@ -35,7 +35,7 @@ public class UnitCollider : UnitComponent { var layerInfo = m_Owner.unitAnimation.layers[0]; AnimationData animData = layerInfo.animationData; - AnimatorClipInfo[] clipInfos = layerInfo.clipInfo; + AnimatorClipInfo[] clipInfos = layerInfo.clipsInfo; //if(clipInfos == null || clipInfos.Length == 0) //{ // return null; 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