From 11bd605dadecb7459bc60fcda33e2e7d8275ed5d Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 22 Jun 2022 21:23:46 +0800 Subject: - multilayer\old animation solution --- .../Scripts/Unit/Action/WaitForActionReachEnd.cs | 3 +- .../Scripts/Unit/AfterImage/AfterImageAvatar.cs | 2 +- .../Unit/Components/UnitAnimation/PCAnimation.cs | 4 +- .../Unit/Components/UnitAnimation/UnitAnimation.cs | 80 ++++++++++++++++++---- .../Assets/Scripts/Unit/Components/UnitCollider.cs | 7 +- .../Unit/Components/UnitState/MonsterState.cs | 8 +-- .../Unit/Components/UnitState/PCState_States.cs | 2 +- .../Scripts/Unit/Components/UnitState/UnitState.cs | 9 ++- .../Scripts/Unit/Controller/UnitController.cs | 4 +- Erika/Assets/Scripts/Unit/TransitionData.cs | 4 +- Erika/Assets/Scripts/Unit/UnitRootMotion.cs | 13 ++-- 11 files changed, 93 insertions(+), 43 deletions(-) diff --git a/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs b/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs index 295b1025..22d7b014 100644 --- a/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs +++ b/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs @@ -21,8 +21,7 @@ public class WaitForActionReachEnd : IEnumerator public bool MoveNext() { - var layer = m_UnitAnimation.layers[m_Layer]; - return layer.playbackNormalizedTime < 1f; + return m_UnitAnimation.playbackNormalizedTime < 1f; } public void Reset() diff --git a/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs b/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs index ec04f3be..ec29b364 100644 --- a/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs +++ b/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs @@ -30,7 +30,7 @@ public class AfterImageAvatar : MonoBehaviour transform.position = prototype.transform.position; animator.runtimeAnimatorController = prototype.unitAnimation.animator.runtimeAnimatorController; - animator.Play(prototype.unitAnimation.baseLayer.stateHash, 0, prototype.unitAnimation.baseLayer.playbackNormalizedTime); + animator.Play(prototype.unitAnimation.stateHash, 0, prototype.unitAnimation.playbackNormalizedTime); animator.speed = 0.02f; animator.Update(1 / 60f); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs index 0620c0b6..0f4f4e11 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs @@ -64,7 +64,7 @@ public class PCAnimation : UnitAnimation LandingGround, } - public override AnimatorLayerInfo baseLayer + private new AnimatorLayerInfo baseLayer { get { return layers[(int)ELayer.Basic]; } } @@ -238,7 +238,7 @@ public class PCAnimation : UnitAnimation public void AnimAirDash() { AnimationData data = GetAnimationDataOfState(EAnimState.AirDash.ToString()); - if (baseLayer.stateInfo.IsName(EAnimState.AirDash.ToString())) + if (stateInfo.IsName(EAnimState.AirDash.ToString())) { float offset = data.GetProperty(EAnimationProperty.ComboTimeOffset, 0); this.Play(EAnimState.AirDash, offset); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs index 931e49ab..653564b7 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs @@ -240,24 +240,23 @@ public class AnimatorLayerInfo playbackSpeed = 1; } - } [DisallowMultipleComponent] public class UnitAnimation : UnitComponent { - public AnimatorLayerInfo[] layers { get { return m_LayerInfo; } } + protected AnimatorLayerInfo[] layers { get { return m_LayerInfo; } } protected AnimatorLayerInfo[] m_LayerInfo; public Animator animator { get { return m_Animator; } } protected Animator m_Animator; - public virtual AnimatorLayerInfo baseLayer + protected virtual AnimatorLayerInfo baseLayer { get { return layers[0]; } - } - - public AnimatorLayerInfo layer + } + + protected AnimatorLayerInfo layer { get { @@ -273,18 +272,71 @@ public class UnitAnimation : UnitComponent } } - public override void OnUpdate() + public AnimationData animationData + { + get + { + return layer.animationData; + } + } + + public AnimatorClipInfo[] clipsInfo + { + get + { + return layer.clipsInfo; + } + } + + public AnimatorClipInfo clipInfo + { + get + { + return layer.clipInfo; + } + } + + public float playbackNormalizedTime + { + get + { + return layer.playbackNormalizedTime; + } + } + + public AnimatorStateInfo stateInfo + { + get + { + return layer.stateInfo; + } + } + + public int stateHash + { + get + { + return layer.stateHash; + } + } + + public override void OnUpdate() { base.OnUpdate(); } - /// - /// 直接播放动作 - /// - /// - /// - /// - public void Play(string animState, int layerIndex = 0, float normalizedTime = float.NegativeInfinity) + public bool IsToggleOpen(EAnimationToogle toggle) + { + return layer.IsToggleOpen(toggle); + } + + /// + /// 直接播放动作 + /// + /// + /// + /// + public void Play(string animState, int layerIndex = 0, float normalizedTime = float.NegativeInfinity) { AnimatorLayerInfo layer = this.layers[layerIndex]; if (layer == null) diff --git a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs index 3fd9a6dc..ff54e7a4 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs @@ -33,14 +33,13 @@ public class UnitCollider : UnitComponent // 返回当前激活的对应类型的碰撞盒数据 public ColliderInfo[] GetCurrentBoxesInfoByType(ColliderBox.EColliderType type, int layer = 0) { - var layerInfo = m_Owner.unitAnimation.layers[0]; - AnimationData animData = layerInfo.animationData; - AnimatorClipInfo[] clipInfos = layerInfo.clipsInfo; + AnimationData animData = m_Owner.unitAnimation.animationData; + AnimatorClipInfo[] clipInfos = m_Owner.unitAnimation.clipsInfo; //if(clipInfos == null || clipInfos.Length == 0) //{ // return null; //} - float playbackTime = layerInfo.playbackNormalizedTime * clipInfos[0].clip.length; + float playbackTime = m_Owner.unitAnimation.playbackNormalizedTime * clipInfos[0].clip.length; //float playbackTime = layerInfo.playbackRealTimeInSeconds; ColliderInfo[] infos = animData.GetActiveCollidersInfo(type, playbackTime); return infos; diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs index 5c1280be..43376f68 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs @@ -116,7 +116,7 @@ public class MonsterState : UnitState yield return null; while (true) { - bool reachEnd = m_Owner.monsterAnimation.layers[0].playbackNormalizedTime == 1; + bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; if(reachEnd) { ChangeState(EUnitState.Idle, new IdleParam()); @@ -140,7 +140,7 @@ public class MonsterState : UnitState yield return null; while (true) { - bool reachEnd = m_Owner.monsterAnimation.layers[0].playbackNormalizedTime == 1; + bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; if (reachEnd) { //yield return new WaitForSeconds(1f); @@ -167,7 +167,7 @@ public class MonsterState : UnitState float g = -15.8f; while (true) { - bool reachEnd = m_Owner.monsterAnimation.baseLayer.playbackNormalizedTime == 1; + bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; if (reachEnd) { vy += g * Time.deltaTime; @@ -198,7 +198,7 @@ public class MonsterState : UnitState yield return null; while (true) { - bool reachEnd = m_Owner.monsterAnimation.layers[0].playbackNormalizedTime == 1; + bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; if (reachEnd) { ChangeState(EUnitState.Idle, new IdleParam()); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs index ff7ca78b..051f1ee8 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs @@ -319,7 +319,7 @@ public partial class PCState : UnitState ChangeState(EUnitState.Landing, new LandingParam()); yield break; } - bool canAttack = m_Owner.pcAnimation.baseLayer.IsToggleOpen(EAnimationToogle.Combo); + bool canAttack = m_Owner.pcAnimation.IsToggleOpen(EAnimationToogle.Combo); if (Input.GetKeyDown("j") && canAttack) { ChangeState(EUnitState.AirAttack, new SkillParam()); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs index 2d39f606..b15aeb38 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs @@ -16,7 +16,7 @@ public class UnitState : UnitComponent { get { - return owner.unitAnimation.baseLayer.playbackNormalizedTime == 1; + return owner.unitAnimation.playbackNormalizedTime == 1; } } @@ -25,10 +25,9 @@ public class UnitState : UnitComponent { get { - var layer = owner.unitAnimation.baseLayer; - if (!layer.animationData.HasProperty(EAnimationProperty.Endpoint)) + if (!owner.unitAnimation.animationData.HasProperty(EAnimationProperty.Endpoint)) return false; - return layer.playbackNormalizedTime >= layer.animationData.GetProperty(EAnimationProperty.Endpoint); + return owner.unitAnimation.playbackNormalizedTime >= owner.unitAnimation.animationData.GetProperty(EAnimationProperty.Endpoint); } } @@ -36,7 +35,7 @@ public class UnitState : UnitComponent { get { - return owner.unitAnimation.baseLayer.IsToggleOpen(EAnimationToogle.Combo); + return owner.unitAnimation.IsToggleOpen(EAnimationToogle.Combo); } } diff --git a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs index 06d5a840..d3f936df 100644 --- a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs @@ -256,8 +256,8 @@ public class UnitController : MonoBehaviour/*, Interactable*/ UnitSnapshotInfo snapshot = new UnitSnapshotInfo(); snapshot.trs = new TRS(unitObj.transform.position, unitObj.transform.rotation, unitObj.transform.lossyScale); snapshot.unit = this; - snapshot.animStateHash = unitAnimation.baseLayer.stateHash; - snapshot.normalizedTime = unitAnimation.baseLayer.playbackNormalizedTime; + snapshot.animStateHash = unitAnimation.stateHash; + snapshot.normalizedTime = unitAnimation.playbackNormalizedTime; return snapshot; } diff --git a/Erika/Assets/Scripts/Unit/TransitionData.cs b/Erika/Assets/Scripts/Unit/TransitionData.cs index c0a47b5d..27333b54 100644 --- a/Erika/Assets/Scripts/Unit/TransitionData.cs +++ b/Erika/Assets/Scripts/Unit/TransitionData.cs @@ -19,6 +19,8 @@ public class TransitionData PoseDifference, // 对比前后pose的差异 } - public float duration; // Fixedtime or Normlaizedtime + public float duration; // FixedTime 或 NormalizedTime + + } diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs index 396189bc..19e8b3b7 100644 --- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs @@ -83,13 +83,12 @@ public class UnitRootMotion : UnitComponent public void UpdateRootMotion() { - bool overrideRootMotion = m_Owner.unitAnimation.baseLayer.animationData.overrideRootMotion; + bool overrideRootMotion = m_Owner.unitAnimation.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; + var rmData = m_Owner.unitAnimation.animationData.rootMotionOverrideData; + float frame = m_Owner.unitAnimation.playbackNormalizedTime * m_Owner.unitAnimation.clipInfo.clip.length * TimelineEventProxy.FPS; + var animData = m_Owner.unitAnimation.animationData; if(animData != m_PrevAnimationData) { m_PrevAnimationData = animData; @@ -113,8 +112,8 @@ public class UnitRootMotion : UnitComponent // 因为Unit被旋转了90度,所以这里的deltaPosition的forward是x方向了 Vector3 dest = m_Owner.unitAnimation.animator.deltaPosition; dest.z = 0; - var state = m_Owner.unitAnimation.baseLayer.stateInfo; - bool ignoreY = m_Owner.unitAnimation.baseLayer.animationData.GetProperty(EAnimationProperty.IgnoreY, 0) != 0; + var state = m_Owner.unitAnimation.stateInfo; + bool ignoreY = m_Owner.unitAnimation.animationData.GetProperty(EAnimationProperty.IgnoreY, 0) != 0; if (state.IsTag("IgnoreY") || ignoreY) { dest.y = 0; -- cgit v1.1-26-g67d0