From 754ceacd8ab62e7094f1827ae45ea16a502725ad Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 6 Aug 2021 19:02:03 +0800 Subject: *curve --- Assets/Scripts/Unit/Component/UnitAnimation.cs | 108 +++++++++++++++++-------- 1 file changed, 75 insertions(+), 33 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 e1bca484..44cfb08b 100644 --- a/Assets/Scripts/Unit/Component/UnitAnimation.cs +++ b/Assets/Scripts/Unit/Component/UnitAnimation.cs @@ -5,6 +5,7 @@ using UnityEngine; using UnityEditor; #endif +// 单独一层动画 public class AnimatorLayerInfo { public UnitAnimation.ELayer layer; @@ -24,7 +25,7 @@ public class AnimatorLayerInfo if (clipInfo == null || clipInfo.Length == 0) return null; var clip = clipInfo[0]; //选第一个 - string folder = m_Owner.folder; + string folder = m_UnitAnimation.owner.folder; string name = clip.clip.name; if (m_AnimationData != null && m_AnimationData.animationName == name) return m_AnimationData; @@ -36,19 +37,19 @@ public class AnimatorLayerInfo } } - // 当前动作所有animation data,包括blendtree使用的所有动画 - //private List m_AnimationDatas; - //public List animationDatas - //{ - // get - // { - // return null; - // } - //} - - // 当前在播放的动作 - // 如果处于transition中,动作不变,切换完成后才会到下一个动作 - public AnimatorStateInfo stateInfo + // 当前动作所有animation data,包括blendtree使用的所有动画 + //private List m_AnimationDatas; + //public List animationDatas + //{ + // get + // { + // return null; + // } + //} + + // 当前在播放的动作 + // 如果处于transition中,动作不变,切换完成后才会到下一个动作 + public AnimatorStateInfo stateInfo { get { @@ -111,7 +112,20 @@ public class AnimatorLayerInfo } } - public float weight + public float playbackSpeed + { + get + { + return m_Animator.GetFloat("PlaybackSpeed" + layerIndex); + } + set + { + float v = Mathf.Clamp(value, 0, 10); + m_Animator.SetFloat("PlaybackSpeed" + layerIndex, v); + } + } + + public float weight { get { @@ -139,19 +153,22 @@ public class AnimatorLayerInfo } } - UnitController m_Owner; + UnitAnimation m_UnitAnimation; - Coroutine m_CalcPlaybackTimeCoroutine; + Coroutine m_CalcPlaybackTimeCoroutine; - public AnimatorLayerInfo(UnitController owner, Animator animator, UnitAnimation.ELayer layer) + TimelineEventProxy m_TimelineEventProxy; + + public AnimatorLayerInfo(UnitAnimation unitAnimation, Animator animator, UnitAnimation.ELayer layer) { - this.m_Owner = owner; + this.m_UnitAnimation = unitAnimation; this.m_Animator = animator; this.layer = layer; - m_CalcPlaybackTimeCoroutine = owner.StartCoroutine(CalcPlaybackRealTimeCoroutine()); - } + m_CalcPlaybackTimeCoroutine = unitAnimation.StartCoroutine(CalcPlaybackRealTimeCoroutine()); + m_TimelineEventProxy = new TimelineEventProxy(unitAnimation.owner.transform, unitAnimation); + } - IEnumerator CalcPlaybackRealTimeCoroutine() + IEnumerator CalcPlaybackRealTimeCoroutine() { while (true) { @@ -164,6 +181,17 @@ public class AnimatorLayerInfo yield return null; } } + + public void OnUpdate() + { + // 执行事件 + m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackTimeInSeconds * TimelineEventProxy.FPS); + if(animationData.speedCurve != null) + { + playbackSpeed = animationData.speedCurve.Evaluate(playbackNomralizedTime); + } + } + } // 控制动画播放、执行动作timeline(包括执行事件和碰撞盒) @@ -210,14 +238,12 @@ public class UnitAnimation : UnitComponent public Animator animator { get { return m_Animator; } } private Animator m_Animator; - private UnitTimeline m_Timeline; - private UnitActionData m_ActionData; public AnimatorLayerInfo[] layers { get { return m_LayerInfo; } } private readonly AnimatorLayerInfo[] m_LayerInfo = new AnimatorLayerInfo[(int)ELayer.Count]; - public bool isInTransition + public bool isInTransition { get { @@ -229,13 +255,12 @@ public class UnitAnimation : UnitComponent { base.Initialize(); - m_Timeline = this.m_Owner.unitObj.GetOrAddComponent(); m_Animator = this.m_Owner.unitObj.GetComponent(); m_Animator.speed = 0; - m_LayerInfo[0] = new AnimatorLayerInfo(m_Owner, m_Animator, ELayer.Basic); - m_LayerInfo[1] = new AnimatorLayerInfo(m_Owner, m_Animator, ELayer.Attack); + m_LayerInfo[0] = new AnimatorLayerInfo(this, m_Animator, ELayer.Basic); + m_LayerInfo[1] = new AnimatorLayerInfo(this, m_Animator, ELayer.Attack); if (m_Animator == null) { @@ -247,11 +272,22 @@ public class UnitAnimation : UnitComponent { base.OnUpdate(); + UpdateLayer(); UpdateAnimation(); UpdateRootMotion(); } - void UpdateAnimation() + void UpdateLayer() + { + m_LayerInfo[0].OnUpdate(); + return; + for (int i = 0; i < m_LayerInfo.Length; ++i) + { + m_LayerInfo[i].OnUpdate(); + } + } + + void UpdateAnimation() { m_Animator.speed = 1; m_Animator.Update(Time.deltaTime); @@ -265,13 +301,19 @@ public class UnitAnimation : UnitComponent public void AnimIdle() { - m_Animator.SetTrigger(ETrigger.ToIdle.ToString()); - } + if(layers[0].stateInfo.shortNameHash != Animator.StringToHash("Idle")) + { + m_Animator.SetTrigger(ETrigger.ToIdle.ToString()); + } + } public void AnimMove() { - m_Animator.SetTrigger(ETrigger.ToMove.ToString()); - } + if (layers[0].stateInfo.shortNameHash != Animator.StringToHash("Move")) + { + m_Animator.SetTrigger(ETrigger.ToMove.ToString()); + } + } public void AnimAttack() { -- cgit v1.1-26-g67d0