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 +++++++++++++++++-------- Assets/Scripts/Unit/Component/UnitState.cs | 56 ++++++++++--- 2 files changed, 121 insertions(+), 43 deletions(-) (limited to 'Assets/Scripts/Unit/Component') 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() { diff --git a/Assets/Scripts/Unit/Component/UnitState.cs b/Assets/Scripts/Unit/Component/UnitState.cs index 4a57ad6d..fd9bba00 100644 --- a/Assets/Scripts/Unit/Component/UnitState.cs +++ b/Assets/Scripts/Unit/Component/UnitState.cs @@ -10,7 +10,9 @@ public class UnitState : UnitComponent { public enum EUnitState { - Idle , + Nien, + + Idle , Move , Spawn , Die , @@ -105,21 +107,47 @@ public class UnitState : UnitComponent return false; } - #region Idle + IEnumerator Nein() { yield break; } + void OnNienExit(EUnitState nextState) { } + + #region Idle IEnumerator Idle(IdleParam param) { - if(m_Owner.isInAir) + if(m_Owner.isInAir) // 浮空切换到landing { } - m_Owner.unitAnimation.AnimIdle(); - yield return null; + else // idle + { + m_Owner.SetYPosition(0); + m_Owner.unitAnimation.AnimIdle(); + while (true) + { + if (Input.GetKeyDown("j")) + { + ChangeState(EUnitState.Skill, new SkillParam()); + } + if (Input.GetKeyDown("space")) + { + ChangeState(EUnitState.Jump, new JumpParam()); + } + if (Input.GetKey("d")) + { + InputManager.Instance.OnMoveRight(); + } + if (Input.GetKey("a")) + { + InputManager.Instance.OnMoveLeft(); + } + yield return null; + } + } } void OnIdleExit(EUnitState nextState) { - LogHelper.Log(nextState.ToString()); + m_Owner.unitAnimation.animator.ResetTrigger("ToIdle"); } #endregion @@ -139,7 +167,7 @@ public class UnitState : UnitComponent } //if (Input.GetKey(param.key)) m_Owner.unitAnimation.AnimMove(); - while (Input.GetKey(param.key)) + while (Input.GetKey(param.key)) { yield return null; } @@ -148,7 +176,7 @@ public class UnitState : UnitComponent void OnMoveExit(EUnitState nextState) { - //m_Owner.unitAnimation.animator.ResetTrigger("ToMove"); + m_Owner.unitAnimation.animator.ResetTrigger("ToMove"); } #endregion @@ -174,8 +202,16 @@ public class UnitState : UnitComponent IEnumerator Jump(JumpParam param) { - yield return new WaitForActionReachEnd(m_Owner.unitAnimation); - ChangeState(EUnitState.Idle); + while(true) + { + // 空中连击 + if(Input.GetKeyDown("j")) + { + SkillParam skill = new SkillParam(); + ChangeState(EUnitState.Skill, skill); + } + yield return null; + } } void OnJumpExit(EUnitState next) -- cgit v1.1-26-g67d0