From bd7fe7bd341f6d3e929a4a9118efdd52a0da2275 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 22 Jun 2022 23:48:45 +0800 Subject: - animation layer --- Erika/Assets/Scripts/Test2/TestErika.cs | 9 +- Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs | 245 ++++++++++++++ .../Assets/Scripts/Unit/AnimatorLayerInfo.cs.meta | 11 + .../Components/UnitAnimation/MonsterAnimation.cs | 29 +- .../Unit/Components/UnitAnimation/PCAnimation.cs | 33 +- .../Unit/Components/UnitAnimation/UnitAnimation.cs | 368 ++++++--------------- .../Assets/Scripts/Unit/Components/UnitCollider.cs | 7 +- .../Scripts/Unit/Components/UnitState/PCState.cs | 16 +- Erika/Assets/Scripts/Unit/UnitActionData.cs | 10 + Erika/Assets/Scripts/Unit/UnitRootMotion.cs | 2 +- 10 files changed, 381 insertions(+), 349 deletions(-) create mode 100644 Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs create mode 100644 Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs.meta 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 { base.Awake(); SetupErika(); - SetupMonster(); + // SetupMonster(); UnitImageEffect.effectPlane = unitEffect; } @@ -64,9 +64,10 @@ public class TestErika : SingletonMB erika.unit.transform.SetParent(erika.unitController.transform); UnitController unitCtr = erika.unitController.GetOrAddComponent(); - 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(); @@ -84,8 +85,6 @@ public class TestErika : SingletonMB 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(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(); - 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(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; - } -} - +/// +/// 角色动作管理 +/// http://unitylore.org/wiki/doku.php?id=l3y0gj +/// [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(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; } /// @@ -341,10 +151,15 @@ public class UnitAnimation : UnitComponent /// 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(); if(rm) @@ -363,10 +178,15 @@ public class UnitAnimation : UnitComponent /// 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(); 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) { -- cgit v1.1-26-g67d0