From 494d3f727786ff70753692d8de019d9600a007e1 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 3 Aug 2021 19:33:43 +0800 Subject: *misc --- Assets/Scripts/Unit/Component/UnitAnimation.cs | 195 ++++++++++++++++++------- 1 file changed, 143 insertions(+), 52 deletions(-) (limited to 'Assets/Scripts/Unit/Component/UnitAnimation.cs') diff --git a/Assets/Scripts/Unit/Component/UnitAnimation.cs b/Assets/Scripts/Unit/Component/UnitAnimation.cs index de3d4cce..5ef7b7a1 100644 --- a/Assets/Scripts/Unit/Component/UnitAnimation.cs +++ b/Assets/Scripts/Unit/Component/UnitAnimation.cs @@ -2,88 +2,179 @@ using System.Collections.Generic; using UnityEngine; -// 控制动画播放,执行帧事件 +public class AnimatorLayerInfo +{ + public UnitAnimation.ELayer layer; + + public int layerIndex { get { return (int)layer; } } + + private Animator m_Animator; + + public AnimationData animationData; + private AnimationData m_AnimationData; + + // 当前在播放的动作 + // 如果处于transition中,动作不变,切换完成后才会到下一个动作 + public AnimatorStateInfo stateInfo + { + get + { + return m_Animator.GetCurrentAnimatorStateInfo(layerIndex); + } + } + + // 当前正在播放和融合的片段信息 + public AnimatorClipInfo[] clipInfo + { + get + { + return m_Animator.GetCurrentAnimatorClipInfo(layerIndex); + } + } + + public int stateHash + { + get + { + return stateInfo.shortNameHash; + } + } + + public float playbackTimeInSeconds + { + get + { + return stateInfo.normalizedTime * stateInfo.length; + } + } + + public float playbackNomralizedTime + { + get + { + return stateInfo.normalizedTime; + } + } + + public int pendingStateHash; + + public AnimatorLayerInfo(Animator animator, UnitAnimation.ELayer layer) + { + this.m_Animator = animator; + this.layer = layer; + } + +} + +// 控制动画播放、执行动作timeline(包括执行事件和碰撞盒) +// 每个layer同时只会有一个动画在播放,在执行transition时,current animation依然是 +// 这个动作,只有完全过渡完成后才会切到下一个动作 +// 当前是什么动作以ainmator的GetCurrentAnimatorStateInfo为准 [DisallowMultipleComponent] public class UnitAnimation : UnitComponent { - // 动画 - public enum EAnimState - { - Idle, - Move, - Jump, - Hit, - Attack, - Rise, - Stinger, - Turn, - } - public enum ELayer { - Basic = 0, - Attack = 1, + Basic = 0, + Attack, + + Count, + } + + // 动作名,和animator里的state对应 + public enum EAnimState + { + // layer 0 + Idle = 0, + Move, + Jump, + Hit, + Attack, + Rise, + Stinger, + Turn, + Landing, + } + + // 切换动画 + public enum ETrigger + { + ToIdle, + ToMove, + ToAttack, } public Animator animator { get { return m_Animator; } } private Animator m_Animator; - private TimelineEvent m_Timeline; - private UnitActionData m_ActionData; + private UnitTimeline m_Timeline; - public AnimatorStateInfo stateInfo - { - get - { - return m_Animator.GetCurrentAnimatorStateInfo(0); - } - } + private UnitActionData m_ActionData; - public EAnimState curState { get { return m_CurState; } } - private EAnimState m_CurState; + public AnimatorLayerInfo[] layers { get { return m_LayerInfo; } } + private AnimatorLayerInfo[] m_LayerInfo = new AnimatorLayerInfo[(int)ELayer.Count]; - public float playbackTime { get { return m_PlaybackTime; } } - private float m_PlaybackTime; + public bool isInTransition + { + get + { + return m_Animator.IsInTransition(0); + } + } + //public EAnimState curState { get { return m_CurState; } } + //private EAnimState m_CurState; public override void Initialize() { base.Initialize(); - m_Timeline = this.m_Owner.unitObj.GetOrAddComponent(); - m_Animator = this.m_Owner.unitObj.GetComponent(); + m_Timeline = this.m_Owner.unitObj.GetOrAddComponent(); + m_Animator = this.m_Owner.unitObj.GetComponent(); + + m_Animator.speed = 0; + + m_LayerInfo[0] = new AnimatorLayerInfo(m_Animator, ELayer.Basic); + m_LayerInfo[1] = new AnimatorLayerInfo(m_Animator, ELayer.Attack); - if(m_Animator == null) + if (m_Animator == null) { LogHelper.LogError("没有挂Animator组件"); } } - public string GetTrigger(EAnimState state) - { - return "To" + state.ToString(); - } - - public void Play(EAnimState state) - { - m_CurState = state; - m_Animator.SetTrigger(GetTrigger(state)); - m_Animator.speed = 0; - m_PlaybackTime = 0; - m_Owner.unitRootMotion.Reset(); - } - public override void OnUpdate() { base.OnUpdate(); - m_PlaybackTime += Time.deltaTime; + UpdateAnimation(); + UpdateRootMotion(); + } - m_Animator.speed = 1; - m_Animator.Update(Time.deltaTime); - m_Animator.speed = 0; + void UpdateAnimation() + { + m_Animator.speed = 1; + m_Animator.Update(Time.deltaTime); + m_Animator.speed = 0; + } - m_Owner.unitRootMotion.UpdateRootMotion(); + void UpdateRootMotion() + { + m_Owner.unitRootMotion.UpdateRootMotion(); + } - } + public void AnimIdle() + { + m_Animator.SetTrigger(ETrigger.ToIdle.ToString()); + } + + public void AnimMove() + { + m_Animator.SetTrigger(ETrigger.ToMove.ToString()); + } + + public void AnimAttack() + { + m_Animator.SetTrigger(ETrigger.ToAttack.ToString()); + } } -- cgit v1.1-26-g67d0