diff options
author | chai <chaifix@163.com> | 2021-08-06 19:02:03 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-08-06 19:02:03 +0800 |
commit | 754ceacd8ab62e7094f1827ae45ea16a502725ad (patch) | |
tree | 7165384f470bf0c4ae261d7dd22876416c150964 /Assets/Scripts/Unit/Component/UnitAnimation.cs | |
parent | 35f2e468715e12d93cb88f2258c2d0ae82d1d189 (diff) |
*curve
Diffstat (limited to 'Assets/Scripts/Unit/Component/UnitAnimation.cs')
-rw-r--r-- | Assets/Scripts/Unit/Component/UnitAnimation.cs | 108 |
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()
{
|