summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Erika/Assets/Scripts/Test2/TestErika.cs9
-rw-r--r--Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs245
-rw-r--r--Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs.meta11
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/MonsterAnimation.cs29
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs33
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs368
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitCollider.cs7
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitState/PCState.cs16
-rw-r--r--Erika/Assets/Scripts/Unit/UnitActionData.cs10
-rw-r--r--Erika/Assets/Scripts/Unit/UnitRootMotion.cs2
10 files changed, 381 insertions, 349 deletions
diff --git a/Erika/Assets/Scripts/Test2/TestErika.cs b/Erika/Assets/Scripts/Test2/TestErika.cs
index e21fe75e..3cedac1b 100644
--- a/Erika/Assets/Scripts/Test2/TestErika.cs
+++ b/Erika/Assets/Scripts/Test2/TestErika.cs
@@ -36,7 +36,7 @@ public class TestErika : SingletonMB<TestErika>
{
base.Awake();
SetupErika();
- SetupMonster();
+ // SetupMonster();
UnitImageEffect.effectPlane = unitEffect;
}
@@ -64,9 +64,10 @@ public class TestErika : SingletonMB<TestErika>
erika.unit.transform.SetParent(erika.unitController.transform);
UnitController unitCtr = erika.unitController.GetOrAddComponent<UnitController>();
- unitCtr.Initialize(erika.unit, erika.unitFolder);
+ unitCtr.Initialize(erika.unit, erika.unitFolder);
+ unitCtr.unitAnimation.m_ActionData = erika.actionData;
- UnitRootMotion unitRootMotion = unitCtr.unitRootMotion;
+ UnitRootMotion unitRootMotion = unitCtr.unitRootMotion;
RootMotionProxy rootMotionProxy = erika.unit.GetOrAddComponent<RootMotionProxy>();
@@ -84,8 +85,6 @@ public class TestErika : SingletonMB<TestErika>
unitCtr.pcState.ChangeState(PCState.EUnitState.Idle, new PCState.IdleParam(), true);
- ////////////////////////////////
-
UnitManager.Instance.SetPlayerCharacter(unitCtr as PCController);
}
diff --git a/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs b/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs
new file mode 100644
index 00000000..ad8d812c
--- /dev/null
+++ b/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs
@@ -0,0 +1,245 @@
+#define ANIM_CROSS_FADE
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+// http://unitylore.org/wiki/doku.php?id=l3y0gj
+
+#if UNIT_ANIMATION_LAYER // 废弃
+// 单独一层动画
+public class AnimatorLayerInfo
+{
+ public int layer;
+
+ public int layerIndex { get { return (int)layer; } }
+
+ public string name { get { return m_Animator.GetLayerName(layerIndex); } }
+
+ public bool isBaseLayer { get { return layerIndex == 0; } }
+
+ private Animator m_Animator;
+
+ // 当前动作的animation data,如果是blendtree选第一个动作
+ private AnimationData m_AnimationData;
+ public AnimationData animationData
+ {
+ get
+ {
+ AnimatorClipInfo[] clipInfos = clipsInfo;
+ if (clipInfos == null || clipInfos.Length == 0)
+ {
+ LogHelper.LogError(LogTag.UnitAnimation, "No current animation.");
+ return null;
+ }
+ var clip = clipInfos[0]; //选第一个
+ string folder = m_UnitAnimation.owner.folder;
+ string name = clip.clip.name;
+ if (m_AnimationData != null && m_AnimationData.animationName == name)
+ return m_AnimationData;
+ string path = folder + "AnimationData/" + name + ".asset" ; // 要注意这里是用名字区别的,因为最终每个角色的动画都会在一个目录下面
+ m_AnimationData = ResourceManager.Instance.LoadAsset<AnimationData>(path);
+ return m_AnimationData;
+ }
+ }
+
+ // 当前在播放的动作
+ // 如果处于transition中,认为当前状态是transition的目标状态(和Animator规则不一样)
+ public AnimatorStateInfo stateInfo
+ {
+ get
+ {
+ AnimatorStateInfo stateInfo = m_Animator.GetCurrentAnimatorStateInfo(layerIndex);
+ if (isInTransition) // 过渡中的动作认为当前动作是下一个动作
+ {
+ stateInfo = m_Animator.GetNextAnimatorStateInfo(layerIndex);
+ }
+ return stateInfo;
+ }
+ }
+
+ private int preStateHash = -1;
+
+ // 当前正在播放和融合的片段信息
+ public AnimatorClipInfo[] clipsInfo
+ {
+ get
+ {
+ AnimatorClipInfo[] clips = null;
+ if (!isInTransition)
+ {
+ clips = m_Animator.GetCurrentAnimatorClipInfo(layerIndex);
+ if (clips.Length == 0)
+ {
+ clips = m_Animator.GetNextAnimatorClipInfo(layerIndex);
+ }
+ }
+ else // 过渡中的动作认为当前动作是下一个动作
+ {
+ clips = m_Animator.GetNextAnimatorClipInfo(layerIndex);
+ }
+ return clips;
+ }
+ }
+
+ public AnimatorClipInfo clipInfo
+ {
+ get
+ {
+ return clipsInfo[0];
+ }
+ }
+
+ public int stateHash
+ {
+ get
+ {
+ return stateInfo.shortNameHash;
+ }
+ }
+
+ // 并非准确的播放时间,只是逻辑时间,因为动画会加速减速
+ public float playbackTimeInSeconds
+ {
+ get
+ {
+ return playbackNormalizedTime * clipInfo.clip.length;
+ }
+ }
+
+ // 这个是真实世界的时间
+ private float m_PlaybackRealTime;
+ public float playbackRealTimeInSeconds
+ {
+ get
+ {
+ return m_PlaybackRealTime;
+ }
+ }
+
+ // 播放进度百分比,[0-1],是逻辑上的,如果动画不是loop,那么播放完后normalizedTime是1
+ public float playbackNormalizedTime
+ {
+ get
+ {
+ AnimatorStateInfo state = stateInfo;
+ if (!state.loop && state.normalizedTime > 1)
+ return 1;
+ return state.normalizedTime % 1f;
+ }
+ }
+
+ 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
+ {
+ return m_Animator.GetLayerWeight(layerIndex);
+ }
+ }
+
+ public int nextStateHash
+ {
+ get
+ {
+ AnimatorStateInfo nextState = m_Animator.GetNextAnimatorStateInfo(layerIndex);
+ int hash = nextState.shortNameHash; // 如果不在过渡中,hash是0
+ return hash;
+ }
+ }
+
+ public bool isInTransition
+ {
+ get
+ {
+ return m_Animator.IsInTransition(layerIndex);
+ }
+ }
+
+ public bool applySpeedCurve { get; set; }
+
+ UnitAnimation m_UnitAnimation;
+
+ Coroutine m_CalcPlaybackTimeCoroutine;
+
+ TimelineEventProxy m_TimelineEventProxy;
+
+ public string m_CurrentState;
+
+ public AnimatorLayerInfo(UnitAnimation unitAnimation, Animator animator, int layer)
+ {
+ this.m_UnitAnimation = unitAnimation;
+ this.m_Animator = animator;
+ this.layer = layer;
+ m_CalcPlaybackTimeCoroutine = unitAnimation.StartCoroutine(CalcPlaybackRealTimeCoroutine());
+ m_TimelineEventProxy = new TimelineEventProxy(unitAnimation.owner);
+ applySpeedCurve = true;
+ }
+
+ IEnumerator CalcPlaybackRealTimeCoroutine()
+ {
+ while (true)
+ {
+ if(preStateHash != stateHash)
+ {
+ m_PlaybackRealTime = 0;
+ }
+ m_PlaybackRealTime += Time.deltaTime;
+ preStateHash = stateHash;
+ yield return null;
+ }
+ }
+
+ public bool IsToggleOpen(EAnimationToogle toggle)
+ {
+ if (m_AnimationData == null)
+ return false;
+ return m_AnimationData.IsToggleOpen(toggle, playbackNormalizedTime);
+ }
+
+ public void OnUpdate()
+ {
+ // 执行事件
+ m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackTimeInSeconds * TimelineEventProxy.FPS);
+
+ // 播放速度控制
+ if (applySpeedCurve && animationData != null && animationData.speedCurve != null)
+ {
+ playbackSpeed = animationData.speedCurve.Evaluate(playbackNormalizedTime);
+ }
+ }
+
+ public void OnCrossFade(string animState, float normalizedTransitionDuration, float normalizedTimeOffset, float normalizedTransitionTime )
+ {
+ m_CurrentState = animState;
+ m_Animator.CrossFade(animState.ToString(), normalizedTransitionDuration, layerIndex, normalizedTimeOffset, normalizedTransitionTime);
+ m_TimelineEventProxy.ResetPrevAnimationData();
+
+ playbackSpeed = 1;
+ }
+
+ public void OnPlay(string animState, float normalizedTime)
+ {
+ m_CurrentState = animState;
+ m_Animator.Play(animState, layerIndex, normalizedTime);
+ m_TimelineEventProxy.ResetPrevAnimationData();
+
+ playbackSpeed = 1;
+ }
+}
+#endif
diff --git a/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs.meta b/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs.meta
new file mode 100644
index 00000000..314232e0
--- /dev/null
+++ b/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c9709ec3fb4bfca4da298db828609434
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/MonsterAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/MonsterAnimation.cs
index ee111f73..f1c60174 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/MonsterAnimation.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/MonsterAnimation.cs
@@ -35,10 +35,6 @@ public class MonsterAnimation : UnitAnimation
m_Animator.speed = 0;
- m_LayerInfo = new AnimatorLayerInfo[2];
- m_LayerInfo[0] = new AnimatorLayerInfo(this, m_Animator, (int)ELayer.Basic);
- //m_LayerInfo[1] = new AnimatorLayerInfo(this, m_Animator, ELayer.Attack);
-
if (m_Animator == null)
{
LogHelper.LogError("没有挂Animator组件");
@@ -50,21 +46,10 @@ public class MonsterAnimation : UnitAnimation
{
base.OnUpdate();
- UpdateLayer();
UpdateAnimation();
UpdateRootMotion();
}
- 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;
@@ -110,19 +95,13 @@ public class MonsterAnimation : UnitAnimation
}
private void Play(EAnimState animState, int layerIndex = 0, float normalizedTime = float.NegativeInfinity)
- {
- AnimatorLayerInfo layer = this.layers[layerIndex];
- if (layer == null)
- return;
- layer.OnPlay(animState.ToString(), normalizedTime);
+ {
+ base.Play(animState.ToString(), layerIndex, normalizedTime);
}
public void CrossFade(EAnimState animState, float normalizedTransitionDuration, int layerIndex = 0, float normalizedTimeOffset = float.NegativeInfinity, float normalizedTransitionTime = 0.0f)
- {
- AnimatorLayerInfo layer = this.layers[layerIndex];
- if (layer == null)
- return;
- layer.OnCrossFade(animState.ToString(), normalizedTransitionDuration, normalizedTimeOffset, normalizedTransitionTime);
+ {
+ base.CrossFade(animState.ToString(), normalizedTransitionDuration, layerIndex, normalizedTimeOffset, normalizedTransitionTime);
}
}
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs
index 1714a9dd..33c1b42d 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs
@@ -20,17 +20,6 @@ public class PCAnimation : UnitAnimation
}
#endif
- public enum ELayer
- {
- Basic = 0,
- Attack,
- SwordAttack,
- GunAttack,
- UpperBody,
- LowerBody,
- Count,
- }
-
// 动作名,和animator里的state对应
public enum EAnimState
@@ -64,11 +53,6 @@ public class PCAnimation : UnitAnimation
LandingGround,
}
- private new AnimatorLayerInfo baseLayer
- {
- get { return layers[(int)ELayer.Basic]; }
- }
-
public bool applyRootMotion { get; set; }
public bool applyRootCurve { get; set; } // 程序生成的root motion
@@ -108,9 +92,9 @@ public class PCAnimation : UnitAnimation
m_Animator = this.m_Owner.unitObj.GetComponent<Animator>();
- m_LayerInfo = new AnimatorLayerInfo[2];
- m_LayerInfo[0] = new AnimatorLayerInfo(this, m_Animator, (int)ELayer.Basic);
- //m_LayerInfo[1] = new AnimatorLayerInfo(this, m_Animator, ELayer.Attack);
+ //m_LayerInfo = new AnimatorLayerInfo[2];
+ //m_LayerInfo[0] = new AnimatorLayerInfo(this, m_Animator, (int)ELayer.Basic);
+ ////m_LayerInfo[1] = new AnimatorLayerInfo(this, m_Animator, ELayer.Attack);
if (m_Animator == null)
{
@@ -126,22 +110,11 @@ public class PCAnimation : UnitAnimation
{
base.OnUpdate();
- UpdateLayer();
UpdateAnimation();
UpdateRootMotion();
UpdateRootCurve();
}
- void UpdateLayer()
- {
- m_LayerInfo[0].OnUpdate();
- return;
- //for (int i = 0; i < m_LayerInfo.Length; ++i)
- //{
- // m_LayerInfo[i].OnUpdate();
- //}
- }
-
void UpdateAnimation()
{
if (!updateAnimationAuto)
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs
index 593bd7b2..529cd2f5 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs
@@ -4,269 +4,26 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
-using UnityEditor;
+using UnityEditor;
#endif
-
-// http://unitylore.org/wiki/doku.php?id=l3y0gj
-
-// 单独一层动画
-public class AnimatorLayerInfo
-{
- public int layer;
-
- public int layerIndex { get { return (int)layer; } }
-
- public string name { get { return m_Animator.GetLayerName(layerIndex); } }
-
- public bool isBaseLayer { get { return layerIndex == 0; } }
-
- private Animator m_Animator;
-
- // 当前动作的animation data,如果是blendtree选第一个动作
- private AnimationData m_AnimationData;
- public AnimationData animationData
- {
- get
- {
- AnimatorClipInfo[] clipInfos = clipsInfo;
- if (clipInfos == null || clipInfos.Length == 0)
- {
- LogHelper.LogError(LogTag.UnitAnimation, "No current animation.");
- return null;
- }
- var clip = clipInfos[0]; //选第一个
- string folder = m_UnitAnimation.owner.folder;
- string name = clip.clip.name;
- if (m_AnimationData != null && m_AnimationData.animationName == name)
- return m_AnimationData;
- string path = folder + "AnimationData/" + name + ".asset" ; // 要注意这里是用名字区别的,因为最终每个角色的动画都会在一个目录下面
- m_AnimationData = ResourceManager.Instance.LoadAsset<AnimationData>(path);
- return m_AnimationData;
- }
- }
-
- // 当前在播放的动作
- // 如果处于transition中,认为当前状态是transition的目标状态(和Animator规则不一样)
- public AnimatorStateInfo stateInfo
- {
- get
- {
- AnimatorStateInfo stateInfo = m_Animator.GetCurrentAnimatorStateInfo(layerIndex);
- if (isInTransition) // 过渡中的动作认为当前动作是下一个动作
- {
- stateInfo = m_Animator.GetNextAnimatorStateInfo(layerIndex);
- }
- return stateInfo;
- }
- }
-
- private int preStateHash = -1;
-
- // 当前正在播放和融合的片段信息
- public AnimatorClipInfo[] clipsInfo
- {
- get
- {
- AnimatorClipInfo[] clips = null;
- if (!isInTransition)
- {
- clips = m_Animator.GetCurrentAnimatorClipInfo(layerIndex);
- if (clips.Length == 0)
- {
- clips = m_Animator.GetNextAnimatorClipInfo(layerIndex);
- }
- }
- else // 过渡中的动作认为当前动作是下一个动作
- {
- clips = m_Animator.GetNextAnimatorClipInfo(layerIndex);
- }
- return clips;
- }
- }
-
- public AnimatorClipInfo clipInfo
- {
- get
- {
- return clipsInfo[0];
- }
- }
-
- public int stateHash
- {
- get
- {
- return stateInfo.shortNameHash;
- }
- }
-
- // 并非准确的播放时间,只是逻辑时间,因为动画会加速减速
- public float playbackTimeInSeconds
- {
- get
- {
- return playbackNormalizedTime * clipInfo.clip.length;
- }
- }
-
- // 这个是真实世界的时间
- private float m_PlaybackRealTime;
- public float playbackRealTimeInSeconds
- {
- get
- {
- return m_PlaybackRealTime;
- }
- }
-
- // 播放进度百分比,[0-1],是逻辑上的,如果动画不是loop,那么播放完后normalizedTime是1
- public float playbackNormalizedTime
- {
- get
- {
- AnimatorStateInfo state = stateInfo;
- if (!state.loop && state.normalizedTime > 1)
- return 1;
- return state.normalizedTime % 1f;
- }
- }
-
- 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
- {
- return m_Animator.GetLayerWeight(layerIndex);
- }
- }
-
- public int nextStateHash
- {
- get
- {
- AnimatorStateInfo nextState = m_Animator.GetNextAnimatorStateInfo(layerIndex);
- int hash = nextState.shortNameHash; // 如果不在过渡中,hash是0
- return hash;
- }
- }
-
- public bool isInTransition
- {
- get
- {
- return m_Animator.IsInTransition(layerIndex);
- }
- }
-
- public bool applySpeedCurve { get; set; }
-
- UnitAnimation m_UnitAnimation;
-
- Coroutine m_CalcPlaybackTimeCoroutine;
-
- TimelineEventProxy m_TimelineEventProxy;
-
- public string m_CurrentState;
-
- public AnimatorLayerInfo(UnitAnimation unitAnimation, Animator animator, int layer)
- {
- this.m_UnitAnimation = unitAnimation;
- this.m_Animator = animator;
- this.layer = layer;
- m_CalcPlaybackTimeCoroutine = unitAnimation.StartCoroutine(CalcPlaybackRealTimeCoroutine());
- m_TimelineEventProxy = new TimelineEventProxy(unitAnimation.owner);
- applySpeedCurve = true;
- }
-
- IEnumerator CalcPlaybackRealTimeCoroutine()
- {
- while (true)
- {
- if(preStateHash != stateHash)
- {
- m_PlaybackRealTime = 0;
- }
- m_PlaybackRealTime += Time.deltaTime;
- preStateHash = stateHash;
- yield return null;
- }
- }
-
- public bool IsToggleOpen(EAnimationToogle toggle)
- {
- if (m_AnimationData == null)
- return false;
- return m_AnimationData.IsToggleOpen(toggle, playbackNormalizedTime);
- }
-
- public void OnUpdate()
- {
- // 执行事件
- m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackTimeInSeconds * TimelineEventProxy.FPS);
-
- // 播放速度控制
- if (applySpeedCurve && animationData != null && animationData.speedCurve != null)
- {
- playbackSpeed = animationData.speedCurve.Evaluate(playbackNormalizedTime);
- }
- }
-
- public void OnCrossFade(string animState, float normalizedTransitionDuration, float normalizedTimeOffset, float normalizedTransitionTime )
- {
- m_CurrentState = animState;
- m_Animator.CrossFade(animState.ToString(), normalizedTransitionDuration, layerIndex, normalizedTimeOffset, normalizedTransitionTime);
- m_TimelineEventProxy.ResetPrevAnimationData();
-
- playbackSpeed = 1;
- }
-
- public void OnPlay(string animState, float normalizedTime)
- {
- m_CurrentState = animState;
- m_Animator.Play(animState, layerIndex, normalizedTime);
- m_TimelineEventProxy.ResetPrevAnimationData();
- playbackSpeed = 1;
- }
-}
-
+/// <summary>
+/// 角色动作管理
+/// http://unitylore.org/wiki/doku.php?id=l3y0gj
+/// </summary>
[DisallowMultipleComponent]
public class UnitAnimation : UnitComponent
{
// 角色的所有动作数据,包括(动画、事件、RM)
- protected UnitActionData m_ActionData;
-
- protected AnimatorLayerInfo[] layers { get { return m_LayerInfo; } }
- protected AnimatorLayerInfo[] m_LayerInfo;
+ public UnitActionData m_ActionData;
+
+ // 当前动作,和AnimatorState不同,忽略过渡,即时切换
+ protected string m_CurrentAction = "Idle";
+ public string currentAction { get { return m_CurrentAction; } }
public Animator animator { get { return m_Animator; } }
protected Animator m_Animator;
- protected virtual AnimatorLayerInfo baseLayer
- {
- get { return layers[0]; }
- }
-
- protected AnimatorLayerInfo layer
- {
- get
- {
- return baseLayer;
- }
- }
-
public bool isInTransition
{
get
@@ -275,62 +32,115 @@ public class UnitAnimation : UnitComponent
}
}
+ // 当前动作的AnimationData
public AnimationData animationData
{
get
{
- return layer.animationData;
+ return m_ActionData.GetAnimationData(currentAction);
}
}
- public AnimatorClipInfo[] clipsInfo
+ // 当前动作的动画片段
+ public AnimationClip animationClip
{
get
{
- return layer.clipsInfo;
+ if(animationData != null)
+ {
+ AnimationClip clip = ResourceManager.Instance.LoadAsset<AnimationClip>(animationData.animationPath);
+ return clip;
+ }
+ return null;
}
}
- public AnimatorClipInfo clipInfo
+ public float playbackNormalizedTime
{
get
{
- return layer.clipInfo;
+ AnimatorStateInfo state = stateInfo;
+ if (!state.loop && state.normalizedTime > 1)
+ return 1;
+ return state.normalizedTime % 1f;
}
}
- public float playbackNormalizedTime
+ public AnimatorStateInfo stateInfo
{
get
{
- return layer.playbackNormalizedTime;
+ AnimatorStateInfo stateInfo = m_Animator.GetCurrentAnimatorStateInfo(0);
+ if (isInTransition) // 过渡中的动作认为当前动作是下一个动作
+ {
+ stateInfo = m_Animator.GetNextAnimatorStateInfo(0);
+ }
+ return stateInfo;
}
}
- public AnimatorStateInfo stateInfo
+ public int stateHash
{
get
{
- return layer.stateInfo;
+ return stateInfo.shortNameHash;
}
}
- public int stateHash
+ // 并非准确的播放时间,只是逻辑时间,因为动画会加速减速
+ public float playbackTimeInSeconds
{
get
{
- return layer.stateHash;
+ return playbackNormalizedTime * animationClip.length;
}
}
+ TimelineEventProxy m_TimelineEventProxy;
+
+ public float playbackSpeed
+ {
+ get
+ {
+ return m_Animator.GetFloat("PlaybackSpeed" + 0);
+ }
+ set
+ {
+ float v = Mathf.Clamp(value, 0, 10);
+ m_Animator.SetFloat("PlaybackSpeed" + 0, v);
+ }
+ }
+
public override void OnUpdate()
{
base.OnUpdate();
- }
+ // 执行事件
+ m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackTimeInSeconds * TimelineEventProxy.FPS);
+
+ // 播放速度控制
+ if (/*applySpeedCurve && */animationData != null && animationData.speedCurve != null)
+ {
+ playbackSpeed = animationData.speedCurve.Evaluate(playbackNormalizedTime);
+ }
+ }
public bool IsToggleOpen(EAnimationToogle toggle)
{
- return layer.IsToggleOpen(toggle);
+ return animationData.IsToggleOpen(toggle, playbackNormalizedTime);
+ }
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ }
+
+ public override void OnPostInitialize()
+ {
+ base.OnPostInitialize();
+
+ m_TimelineEventProxy = new TimelineEventProxy(this.owner);
+ playbackSpeed = 1f;
}
/// <summary>
@@ -341,10 +151,15 @@ public class UnitAnimation : UnitComponent
/// <param name="normalizedTime"></param>
public void Play(string animState, int layerIndex = 0, float normalizedTime = float.NegativeInfinity)
{
- AnimatorLayerInfo layer = this.layers[layerIndex];
- if (layer == null)
- return;
- layer.OnPlay(animState, normalizedTime);
+ //AnimatorLayerInfo layer = this.layers[layerIndex];
+ //if (layer == null)
+ // return;
+ //layer.OnPlay(animState, normalizedTime);
+
+ m_CurrentAction = animState;
+
+ m_Animator.Play(animState, layerIndex, normalizedTime);
+ m_TimelineEventProxy.ResetPrevAnimationData();
UnitRootMotion rm = m_Owner.GetComponent<UnitRootMotion>();
if(rm)
@@ -363,10 +178,15 @@ public class UnitAnimation : UnitComponent
/// <param name="normalizedTransitionTime"></param>
public void CrossFade(string animState, float normalizedTransitionDuration, int layerIndex = 0, float normalizedTimeOffset = float.NegativeInfinity, float normalizedTransitionTime = 0.0f)
{
- AnimatorLayerInfo layer = this.layers[layerIndex];
- if (layer == null)
- return;
- layer.OnCrossFade(animState, normalizedTransitionDuration, normalizedTimeOffset, normalizedTransitionTime);
+ //AnimatorLayerInfo layer = this.layers[layerIndex];
+ //if (layer == null)
+ // return;
+ //layer.OnCrossFade(animState, normalizedTransitionDuration, normalizedTimeOffset, normalizedTransitionTime);
+
+ m_CurrentAction = animState;
+
+ m_Animator.CrossFade(animState.ToString(), normalizedTransitionDuration, layerIndex, normalizedTimeOffset, normalizedTransitionTime);
+ m_TimelineEventProxy.ResetPrevAnimationData();
UnitRootMotion rm = m_Owner.GetComponent<UnitRootMotion>();
if (rm)
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs
index ff54e7a4..48ec46bb 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs
@@ -34,12 +34,7 @@ public class UnitCollider : UnitComponent
public ColliderInfo[] GetCurrentBoxesInfoByType(ColliderBox.EColliderType type, int layer = 0)
{
AnimationData animData = m_Owner.unitAnimation.animationData;
- AnimatorClipInfo[] clipInfos = m_Owner.unitAnimation.clipsInfo;
- //if(clipInfos == null || clipInfos.Length == 0)
- //{
- // return null;
- //}
- float playbackTime = m_Owner.unitAnimation.playbackNormalizedTime * clipInfos[0].clip.length;
+ float playbackTime = m_Owner.unitAnimation.playbackNormalizedTime * m_Owner.unitAnimation.animationClip.length;
//float playbackTime = layerInfo.playbackRealTimeInSeconds;
ColliderInfo[] infos = animData.GetActiveCollidersInfo(type, playbackTime);
return infos;
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/PCState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/PCState.cs
index 98eb2f6a..c3e69830 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitState/PCState.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitState/PCState.cs
@@ -140,17 +140,17 @@ public partial class PCState : UnitState
{
if (Input.GetKeyDown("i"))
{
- float offset = owner.isTowardRight ? 1.5f : -1.5f;
+ //float offset = owner.isTowardRight ? 1.5f : -1.5f;
- Vector3 targetPos = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0);
- targetPos.y = Mathf.Max(1, targetPos.y);
+ //Vector3 targetPos = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0);
+ //targetPos.y = Mathf.Max(1, targetPos.y);
- UnitSnapshotInfo info = owner.TakeSnapshot();
- Vector2 dir = targetPos - owner.center;
- owner.unitLensEffect.Dash(Color.white, 0.1f, Mathf.Rad2Deg * Mathf.Atan2(dir.y, dir.x), info);
+ //UnitSnapshotInfo info = owner.TakeSnapshot();
+ //Vector2 dir = targetPos - owner.center;
+ //owner.unitLensEffect.Dash(Color.white, 0.1f, Mathf.Rad2Deg * Mathf.Atan2(dir.y, dir.x), info);
- owner.center = targetPos;
- TurnAround(!owner.isTowardRight);
+ //owner.center = targetPos;
+ //TurnAround(!owner.isTowardRight);
return true;
}
return false;
diff --git a/Erika/Assets/Scripts/Unit/UnitActionData.cs b/Erika/Assets/Scripts/Unit/UnitActionData.cs
index 75ccee57..43643491 100644
--- a/Erika/Assets/Scripts/Unit/UnitActionData.cs
+++ b/Erika/Assets/Scripts/Unit/UnitActionData.cs
@@ -18,4 +18,14 @@ public class UnitActionData : ScriptableObject
public TriggerAnimationDictionary actions;
+ public AnimationData GetAnimationData(string actionName)
+ {
+ AnimationData animData;
+ if(actions.TryGetValue(actionName, out animData))
+ {
+ return animData;
+ }
+ return null;
+ }
+
}
diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs
index 19e8b3b7..3acd7994 100644
--- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs
+++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs
@@ -87,7 +87,7 @@ public class UnitRootMotion : UnitComponent
if(overrideRootMotion)
{
var rmData = m_Owner.unitAnimation.animationData.rootMotionOverrideData;
- float frame = m_Owner.unitAnimation.playbackNormalizedTime * m_Owner.unitAnimation.clipInfo.clip.length * TimelineEventProxy.FPS;
+ float frame = m_Owner.unitAnimation.playbackNormalizedTime * m_Owner.unitAnimation.animationClip.length * TimelineEventProxy.FPS;
var animData = m_Owner.unitAnimation.animationData;
if(animData != m_PrevAnimationData)
{