summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/Component/UnitAnimation.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-08-06 19:02:03 +0800
committerchai <chaifix@163.com>2021-08-06 19:02:03 +0800
commit754ceacd8ab62e7094f1827ae45ea16a502725ad (patch)
tree7165384f470bf0c4ae261d7dd22876416c150964 /Assets/Scripts/Unit/Component/UnitAnimation.cs
parent35f2e468715e12d93cb88f2258c2d0ae82d1d189 (diff)
*curve
Diffstat (limited to 'Assets/Scripts/Unit/Component/UnitAnimation.cs')
-rw-r--r--Assets/Scripts/Unit/Component/UnitAnimation.cs108
1 files changed, 75 insertions, 33 deletions
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<AnimationData> m_AnimationDatas;
- //public List<AnimationData> animationDatas
- //{
- // get
- // {
- // return null;
- // }
- //}
-
- // 当前在播放的动作
- // 如果处于transition中,动作不变,切换完成后才会到下一个动作
- public AnimatorStateInfo stateInfo
+ // 当前动作所有animation data,包括blendtree使用的所有动画
+ //private List<AnimationData> m_AnimationDatas;
+ //public List<AnimationData> 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<UnitTimeline>();
m_Animator = this.m_Owner.unitObj.GetComponent<Animator>();
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()
{