From 494d3f727786ff70753692d8de019d9600a007e1 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 3 Aug 2021 19:33:43 +0800 Subject: *misc --- Assets/Scripts/Input/InputManager.cs | 2 +- .../Scripts/Unit/Action/WaitForActionReachEnd.cs | 10 +- Assets/Scripts/Unit/Action/WaitForLanding.cs | 25 +++ Assets/Scripts/Unit/Action/WaitForLanding.cs.meta | 11 ++ .../Scripts/Unit/Action/WaitForTransitionDone.cs | 25 +++ .../Unit/Action/WaitForTransitionDone.cs.meta | 11 ++ Assets/Scripts/Unit/AnimationData.cs | 7 +- Assets/Scripts/Unit/Component/UnitAnimation.cs | 195 +++++++++++++++------ Assets/Scripts/Unit/Component/UnitState.cs | 86 +++++---- Assets/Scripts/Unit/Controller/PCController.cs | 3 - Assets/Scripts/Unit/Controller/UnitController.cs | 16 ++ Assets/Scripts/Unit/Events/AnimationEventBase.cs | 2 +- Assets/Scripts/Unit/Events/EventEffect.cs | 2 +- Assets/Scripts/Unit/Events/EventProjectile.cs | 2 +- Assets/Scripts/Unit/TimelineEvent.cs | 115 ------------ Assets/Scripts/Unit/TimelineEvent.cs.meta | 11 -- Assets/Scripts/Unit/UnitRootMotion.cs | 5 +- Assets/Scripts/Unit/UnitTimeline.cs | 115 ++++++++++++ Assets/Scripts/Unit/UnitTimeline.cs.meta | 11 ++ 19 files changed, 428 insertions(+), 226 deletions(-) create mode 100644 Assets/Scripts/Unit/Action/WaitForLanding.cs create mode 100644 Assets/Scripts/Unit/Action/WaitForLanding.cs.meta create mode 100644 Assets/Scripts/Unit/Action/WaitForTransitionDone.cs create mode 100644 Assets/Scripts/Unit/Action/WaitForTransitionDone.cs.meta delete mode 100644 Assets/Scripts/Unit/TimelineEvent.cs delete mode 100644 Assets/Scripts/Unit/TimelineEvent.cs.meta create mode 100644 Assets/Scripts/Unit/UnitTimeline.cs create mode 100644 Assets/Scripts/Unit/UnitTimeline.cs.meta (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/Input/InputManager.cs b/Assets/Scripts/Input/InputManager.cs index 47617c36..fadf3556 100644 --- a/Assets/Scripts/Input/InputManager.cs +++ b/Assets/Scripts/Input/InputManager.cs @@ -31,7 +31,7 @@ public class InputManager : SingletonMB UnitState.MoveParam move = new UnitState.MoveParam(); move.isRight = false; move.key = "a"; - pc.unitState.ChangeState(UnitState.EUnitState.Move, move, true); + pc.unitState.ChangeState(UnitState.EUnitState.Move, move); } public void OnTurnBack() diff --git a/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs b/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs index 3f5d20d4..ab755b64 100644 --- a/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs +++ b/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs @@ -6,17 +6,19 @@ using UnityEngine; public class WaitForActionReachEnd : IEnumerator { UnitAnimation m_UnitAnimation; - - public WaitForActionReachEnd(UnitAnimation unitAnim) + UnitAnimation.ELayer m_Layer; + + public WaitForActionReachEnd(UnitAnimation unitAnim, UnitAnimation.ELayer layer = UnitAnimation.ELayer.Basic) { m_UnitAnimation = unitAnim; - } + m_Layer = layer; + } public object Current => null; public bool MoveNext() { - var stateInfo = m_UnitAnimation.stateInfo; + var stateInfo = m_UnitAnimation.layers[(int)m_Layer].stateInfo; float normalTime = stateInfo.normalizedTime; LogHelper.Log(stateInfo.loop.ToString()); return normalTime < 1f; diff --git a/Assets/Scripts/Unit/Action/WaitForLanding.cs b/Assets/Scripts/Unit/Action/WaitForLanding.cs new file mode 100644 index 00000000..5c9736ac --- /dev/null +++ b/Assets/Scripts/Unit/Action/WaitForLanding.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class WaitForLanding : IEnumerator +{ + UnitController controller; + + public WaitForLanding(UnitController controller) + { + this.controller = controller; + } + + public object Current => null; + + public bool MoveNext() + { + return controller.isInAir; + } + + public void Reset() + { + } +} diff --git a/Assets/Scripts/Unit/Action/WaitForLanding.cs.meta b/Assets/Scripts/Unit/Action/WaitForLanding.cs.meta new file mode 100644 index 00000000..5098bc64 --- /dev/null +++ b/Assets/Scripts/Unit/Action/WaitForLanding.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8352853e3875584bb29bdcff4d9a586 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs b/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs new file mode 100644 index 00000000..82f3e792 --- /dev/null +++ b/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class WaitForTransitionDone : IEnumerator +{ + UnitAnimation m_UnitAnimation; + + public WaitForTransitionDone(UnitAnimation unitAnim) + { + m_UnitAnimation = unitAnim; + } + + public object Current => null; + + public bool MoveNext() + { + return m_UnitAnimation.isInTransition; + } + + public void Reset() + { + } +} diff --git a/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs.meta b/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs.meta new file mode 100644 index 00000000..54f35f87 --- /dev/null +++ b/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1729935affb1cc14c839545a43360dcb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/AnimationData.cs b/Assets/Scripts/Unit/AnimationData.cs index f1204a50..9c880670 100644 --- a/Assets/Scripts/Unit/AnimationData.cs +++ b/Assets/Scripts/Unit/AnimationData.cs @@ -6,7 +6,7 @@ using UnityEngine; using UnityEditor; #endif -// 某个动画的数据,包括帧事件、碰撞盒 +// 某个动画的数据,包括帧事件、碰撞盒、速度曲线 [CreateAssetMenu(fileName = "Animation Data")] public class AnimationData : ScriptableObject { @@ -20,7 +20,10 @@ public class AnimationData : ScriptableObject public List throwBoxes; public List blockBoxes; public List defendBoxes; - + + // 对应的进度的播放速度,默认是1 + public AnimationCurve curve; + public int GetBoxesCount() { int hurt = hurtBoxes != null ? hurtBoxes.Count : 0; diff --git a/Assets/Scripts/Unit/Component/UnitAnimation.cs b/Assets/Scripts/Unit/Component/UnitAnimation.cs index de3d4cce..5ef7b7a1 100644 --- a/Assets/Scripts/Unit/Component/UnitAnimation.cs +++ b/Assets/Scripts/Unit/Component/UnitAnimation.cs @@ -2,88 +2,179 @@ using System.Collections.Generic; using UnityEngine; -// 控制动画播放,执行帧事件 +public class AnimatorLayerInfo +{ + public UnitAnimation.ELayer layer; + + public int layerIndex { get { return (int)layer; } } + + private Animator m_Animator; + + public AnimationData animationData; + private AnimationData m_AnimationData; + + // 当前在播放的动作 + // 如果处于transition中,动作不变,切换完成后才会到下一个动作 + public AnimatorStateInfo stateInfo + { + get + { + return m_Animator.GetCurrentAnimatorStateInfo(layerIndex); + } + } + + // 当前正在播放和融合的片段信息 + public AnimatorClipInfo[] clipInfo + { + get + { + return m_Animator.GetCurrentAnimatorClipInfo(layerIndex); + } + } + + public int stateHash + { + get + { + return stateInfo.shortNameHash; + } + } + + public float playbackTimeInSeconds + { + get + { + return stateInfo.normalizedTime * stateInfo.length; + } + } + + public float playbackNomralizedTime + { + get + { + return stateInfo.normalizedTime; + } + } + + public int pendingStateHash; + + public AnimatorLayerInfo(Animator animator, UnitAnimation.ELayer layer) + { + this.m_Animator = animator; + this.layer = layer; + } + +} + +// 控制动画播放、执行动作timeline(包括执行事件和碰撞盒) +// 每个layer同时只会有一个动画在播放,在执行transition时,current animation依然是 +// 这个动作,只有完全过渡完成后才会切到下一个动作 +// 当前是什么动作以ainmator的GetCurrentAnimatorStateInfo为准 [DisallowMultipleComponent] public class UnitAnimation : UnitComponent { - // 动画 - public enum EAnimState - { - Idle, - Move, - Jump, - Hit, - Attack, - Rise, - Stinger, - Turn, - } - public enum ELayer { - Basic = 0, - Attack = 1, + Basic = 0, + Attack, + + Count, + } + + // 动作名,和animator里的state对应 + public enum EAnimState + { + // layer 0 + Idle = 0, + Move, + Jump, + Hit, + Attack, + Rise, + Stinger, + Turn, + Landing, + } + + // 切换动画 + public enum ETrigger + { + ToIdle, + ToMove, + ToAttack, } public Animator animator { get { return m_Animator; } } private Animator m_Animator; - private TimelineEvent m_Timeline; - private UnitActionData m_ActionData; + private UnitTimeline m_Timeline; - public AnimatorStateInfo stateInfo - { - get - { - return m_Animator.GetCurrentAnimatorStateInfo(0); - } - } + private UnitActionData m_ActionData; - public EAnimState curState { get { return m_CurState; } } - private EAnimState m_CurState; + public AnimatorLayerInfo[] layers { get { return m_LayerInfo; } } + private AnimatorLayerInfo[] m_LayerInfo = new AnimatorLayerInfo[(int)ELayer.Count]; - public float playbackTime { get { return m_PlaybackTime; } } - private float m_PlaybackTime; + public bool isInTransition + { + get + { + return m_Animator.IsInTransition(0); + } + } + //public EAnimState curState { get { return m_CurState; } } + //private EAnimState m_CurState; public override void Initialize() { base.Initialize(); - m_Timeline = this.m_Owner.unitObj.GetOrAddComponent(); - m_Animator = this.m_Owner.unitObj.GetComponent(); + m_Timeline = this.m_Owner.unitObj.GetOrAddComponent(); + m_Animator = this.m_Owner.unitObj.GetComponent(); + + m_Animator.speed = 0; + + m_LayerInfo[0] = new AnimatorLayerInfo(m_Animator, ELayer.Basic); + m_LayerInfo[1] = new AnimatorLayerInfo(m_Animator, ELayer.Attack); - if(m_Animator == null) + if (m_Animator == null) { LogHelper.LogError("没有挂Animator组件"); } } - public string GetTrigger(EAnimState state) - { - return "To" + state.ToString(); - } - - public void Play(EAnimState state) - { - m_CurState = state; - m_Animator.SetTrigger(GetTrigger(state)); - m_Animator.speed = 0; - m_PlaybackTime = 0; - m_Owner.unitRootMotion.Reset(); - } - public override void OnUpdate() { base.OnUpdate(); - m_PlaybackTime += Time.deltaTime; + UpdateAnimation(); + UpdateRootMotion(); + } - m_Animator.speed = 1; - m_Animator.Update(Time.deltaTime); - m_Animator.speed = 0; + void UpdateAnimation() + { + m_Animator.speed = 1; + m_Animator.Update(Time.deltaTime); + m_Animator.speed = 0; + } - m_Owner.unitRootMotion.UpdateRootMotion(); + void UpdateRootMotion() + { + m_Owner.unitRootMotion.UpdateRootMotion(); + } - } + public void AnimIdle() + { + m_Animator.SetTrigger(ETrigger.ToIdle.ToString()); + } + + public void AnimMove() + { + m_Animator.SetTrigger(ETrigger.ToMove.ToString()); + } + + public void AnimAttack() + { + m_Animator.SetTrigger(ETrigger.ToAttack.ToString()); + } } diff --git a/Assets/Scripts/Unit/Component/UnitState.cs b/Assets/Scripts/Unit/Component/UnitState.cs index 587c2f33..4a57ad6d 100644 --- a/Assets/Scripts/Unit/Component/UnitState.cs +++ b/Assets/Scripts/Unit/Component/UnitState.cs @@ -11,34 +11,31 @@ public class UnitState : UnitComponent public enum EUnitState { Idle , - Move , - Spawn , - Die , - Dead , - Skill , - // - HitAir , - HitAirHit , - Knockdown , - // - HitGuard , - // - Walk , - // - Rise , - // - Jump , - // 转身 - Turn , + Move , + Spawn , + Die , + Dead , + Skill , + // + HitAir , + HitAirHit , + Knockdown , + // + HitGuard , + // + Walk , + // + Rise , + // + Jump , + // 转身 + Turn , + Landing , // 从空中降落 } [SerializeField] private EUnitState m_State; public EUnitState CurrentState { get { return m_State; } } - private delegate void ExitStateHandler(EUnitState nextState); - - private Dictionary m_ExitStateHandlerDic = new Dictionary(); - public override void Initialize() { base.Initialize(); @@ -68,6 +65,8 @@ public class UnitState : UnitComponent EUnitState nextState; } + public struct LandingParam { } + #endregion void InitState() @@ -110,8 +109,12 @@ public class UnitState : UnitComponent IEnumerator Idle(IdleParam param) { - m_Owner.unitAnimation.Play(UnitAnimation.EAnimState.Idle); - yield return null; + if(m_Owner.isInAir) + { + + } + m_Owner.unitAnimation.AnimIdle(); + yield return null; } void OnIdleExit(EUnitState nextState) @@ -134,9 +137,9 @@ public class UnitState : UnitComponent // m_Owner.transform.rotation = Quaternion.Euler(0, 180, 0); m_Owner.transform.rotation = Quaternion.Euler(0, param.isRight ? 0 : 180, 0); } - if(Input.GetKey(param.key)) - m_Owner.unitAnimation.Play(UnitAnimation.EAnimState.Move); - while (Input.GetKey(param.key)) + //if (Input.GetKey(param.key)) + m_Owner.unitAnimation.AnimMove(); + while (Input.GetKey(param.key)) { yield return null; } @@ -145,7 +148,7 @@ public class UnitState : UnitComponent void OnMoveExit(EUnitState nextState) { - + //m_Owner.unitAnimation.animator.ResetTrigger("ToMove"); } #endregion @@ -154,8 +157,9 @@ public class UnitState : UnitComponent IEnumerator Skill(SkillParam param) { - m_Owner.unitAnimation.Play(UnitAnimation.EAnimState.Attack); - yield return new WaitForActionReachEnd(m_Owner.unitAnimation); + m_Owner.unitAnimation.AnimAttack(); + yield return new WaitForTransitionDone(m_Owner.unitAnimation); + yield return new WaitForActionReachEnd(m_Owner.unitAnimation); ChangeState(EUnitState.Idle, new IdleParam()); } @@ -170,7 +174,6 @@ public class UnitState : UnitComponent IEnumerator Jump(JumpParam param) { - m_Owner.unitAnimation.Play(UnitAnimation.EAnimState.Jump); yield return new WaitForActionReachEnd(m_Owner.unitAnimation); ChangeState(EUnitState.Idle); } @@ -180,6 +183,23 @@ public class UnitState : UnitComponent } - #endregion + #endregion + + #region Landing + + IEnumerator Landing(LandingParam param) + { + yield return new WaitForLanding(m_Owner); + Vector3 pos = m_Owner.transform.position; + pos.y = 0; + m_Owner.transform.position = pos; + ChangeState(EUnitState.Idle); + } + + void OnLandingExit(EUnitState next) + { + } + + #endregion } diff --git a/Assets/Scripts/Unit/Controller/PCController.cs b/Assets/Scripts/Unit/Controller/PCController.cs index ed472cdb..4904d60e 100644 --- a/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Assets/Scripts/Unit/Controller/PCController.cs @@ -17,11 +17,8 @@ public class PCController : UnitController { base.Initialize(obj); - - } - public override void Update() { base.Update(); diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs index 8cea1331..1863ad69 100644 --- a/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Assets/Scripts/Unit/Controller/UnitController.cs @@ -26,6 +26,22 @@ public class UnitController : MonoBehaviour } } + public virtual bool isOnGround + { + get + { + return transform.position.y <= 0f; + } + } + + public bool isInAir + { + get + { + return !isOnGround; + } + } + public virtual void Initialize( GameObject obj ) { unitObj = obj; diff --git a/Assets/Scripts/Unit/Events/AnimationEventBase.cs b/Assets/Scripts/Unit/Events/AnimationEventBase.cs index 42fe6460..613eff27 100644 --- a/Assets/Scripts/Unit/Events/AnimationEventBase.cs +++ b/Assets/Scripts/Unit/Events/AnimationEventBase.cs @@ -7,7 +7,7 @@ public abstract class AnimationEventBase : ScriptableObject { public int startFrame; - public abstract TimelineEvent.EEventType type { get; } + public abstract UnitTimeline.EEventType type { get; } public string fullName { diff --git a/Assets/Scripts/Unit/Events/EventEffect.cs b/Assets/Scripts/Unit/Events/EventEffect.cs index 9aaf8d9f..61a4a7e3 100644 --- a/Assets/Scripts/Unit/Events/EventEffect.cs +++ b/Assets/Scripts/Unit/Events/EventEffect.cs @@ -4,7 +4,7 @@ using UnityEngine; public class EventEffect : AnimationEventBase { - public override TimelineEvent.EEventType type { get { return TimelineEvent.EEventType.EventEffect; } } + public override UnitTimeline.EEventType type { get { return UnitTimeline.EEventType.EventEffect; } } public override string shortName { get { return "E"; } } [Tooltip("Effect path")] diff --git a/Assets/Scripts/Unit/Events/EventProjectile.cs b/Assets/Scripts/Unit/Events/EventProjectile.cs index 526628e8..032c93bb 100644 --- a/Assets/Scripts/Unit/Events/EventProjectile.cs +++ b/Assets/Scripts/Unit/Events/EventProjectile.cs @@ -4,7 +4,7 @@ using UnityEngine; public class EventProjectile : AnimationEventBase { - public override TimelineEvent.EEventType type { get { return TimelineEvent.EEventType.EventProjectile; } } + public override UnitTimeline.EEventType type { get { return UnitTimeline.EEventType.EventProjectile; } } public override string shortName { get { return "P"; } } diff --git a/Assets/Scripts/Unit/TimelineEvent.cs b/Assets/Scripts/Unit/TimelineEvent.cs deleted file mode 100644 index 6a69934b..00000000 --- a/Assets/Scripts/Unit/TimelineEvent.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; -using System.Collections.Generic; -using UnityEngine; -#if UNITY_EDITOR -using UnityEditor; -#endif - -// 动画帧事件 -[DisallowMultipleComponent] -public partial class TimelineEvent: MonoBehaviour -{ - public enum EEventType - { - EventCamera_Zoom, // 相机聚焦 - EventCamera_Shake, // 相机晃动 - EventCamera_Blur, // 相机模糊 - EventCamera_WhiteOut, // 相机白屏 - - EventMesh_AfterImage, // 角色残像 - EventMesh_Fade, // 角色透明度 - EventMesh_Gloss, // 角色泛光 - - EventEnv_Dark, - EventEnv_Exposure, - - EventUI_Drift, // - EventUI_Blur, // - - EventProjectile, // 发射体 - EventEffect, // 特效 - EventSound, // 音效 - - EventBulletTime, // 子弹时间 - } - - public const int kMaxEventsPerFrame = 10; - - private int m_PrevFrame = -1; - - public static Type GetTypeByName(string name) - { - Type type = Type.GetType(name); - return type; - } - - public void ExecuteAnimationEvents(AnimationData animData, float animFrame) - { - if (animData == null) - return; - int frame = (int)animFrame; - if(frame != m_PrevFrame) - { - for(int i = m_PrevFrame + 1; i <= frame; i++) - { - List framesHasEvent = animData.GetAnimationEventFrameIndices(); - if (framesHasEvent.Contains(i)) - { - List events = animData.GetAnimationEventsAtFrame(i); - ExecuteEvents(events); - ListPool.Release(events); - } - ListPool.Release(framesHasEvent); - } - } - m_PrevFrame = frame; - } - - void ExecuteEvents(List events) - { - if (events == null || events.Count == 0) - return; - foreach(var e in events) - { - string name = e.type.ToString(); - MethodInfo method = GetType().GetMethod(name, BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(AnimationEventBase) }, null); - if(method != null) - { - object[] param = new object[] {e }; - method.Invoke(this, param); - } - } - } - - #region Event handle - - void EventEffect(AnimationEventBase animEvent) - { - EventEffect effect = animEvent as EventEffect; - if (effect == null) - return; - string path = effect.effectPath; -#if UNITY_EDITOR - GameObject prefab = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject; - if(prefab != null) - { - GameObject root = new GameObject(); - - GameObject go = GameObject.Instantiate(prefab); - go.transform.SetParent(root.transform); - FxClear onClear = root.AddComponent(); - onClear.RunInEditor = true; - onClear.Initialize(new PlayEffectInfo(path, EffectPlayTypes.Oneshot, transform, effect.position, effect.rotation, effect.scale, 0, false)); - } -#endif - } - - void EventCamera_Shake(AnimationEventBase animEvent) - { - - } - - #endregion -} \ No newline at end of file diff --git a/Assets/Scripts/Unit/TimelineEvent.cs.meta b/Assets/Scripts/Unit/TimelineEvent.cs.meta deleted file mode 100644 index 50d16ded..00000000 --- a/Assets/Scripts/Unit/TimelineEvent.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9991268d8dcef1f43bcab1e7a31f6511 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Unit/UnitRootMotion.cs b/Assets/Scripts/Unit/UnitRootMotion.cs index 542b08fd..58ae814e 100644 --- a/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Assets/Scripts/Unit/UnitRootMotion.cs @@ -20,12 +20,13 @@ public class UnitRootMotion : UnitComponent base.Initialize(); } +#if false // 用自定义root motion + public void Reset() { m_PrevNormalTime = 0; } -#if false // 用自定义root motion public override void OnUpdate() { base.OnUpdate(); @@ -62,7 +63,7 @@ public class UnitRootMotion : UnitComponent #else - public override void OnUpdate() + public override void OnUpdate() { base.OnUpdate(); } diff --git a/Assets/Scripts/Unit/UnitTimeline.cs b/Assets/Scripts/Unit/UnitTimeline.cs new file mode 100644 index 00000000..ba8e652a --- /dev/null +++ b/Assets/Scripts/Unit/UnitTimeline.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections; +using System.Reflection; +using System.Collections.Generic; +using UnityEngine; +#if UNITY_EDITOR +using UnityEditor; +#endif + +// 处理动画帧事件和碰撞盒 +[DisallowMultipleComponent] +public partial class UnitTimeline : MonoBehaviour +{ + public enum EEventType + { + EventCamera_Zoom, // 相机聚焦 + EventCamera_Shake, // 相机晃动 + EventCamera_Blur, // 相机模糊 + EventCamera_WhiteOut, // 相机白屏 + + EventMesh_AfterImage, // 角色残像 + EventMesh_Fade, // 角色透明度 + EventMesh_Gloss, // 角色泛光 + + EventEnv_Dark, + EventEnv_Exposure, + + EventUI_Drift, // + EventUI_Blur, // + + EventProjectile, // 发射体 + EventEffect, // 特效 + EventSound, // 音效 + + EventBulletTime, // 子弹时间 + } + + public const int kMaxEventsPerFrame = 10; + + private int m_PrevFrame = -1; + + public static Type GetTypeByName(string name) + { + Type type = Type.GetType(name); + return type; + } + + public void ExecuteAnimationEvents(AnimationData animData, float animFrame) + { + if (animData == null) + return; + int frame = (int)animFrame; + if (frame != m_PrevFrame) + { + for (int i = m_PrevFrame + 1; i <= frame; i++) + { + List framesHasEvent = animData.GetAnimationEventFrameIndices(); + if (framesHasEvent.Contains(i)) + { + List events = animData.GetAnimationEventsAtFrame(i); + ExecuteEvents(events); + ListPool.Release(events); + } + ListPool.Release(framesHasEvent); + } + } + m_PrevFrame = frame; + } + + void ExecuteEvents(List events) + { + if (events == null || events.Count == 0) + return; + foreach (var e in events) + { + string name = e.type.ToString(); + MethodInfo method = GetType().GetMethod(name, BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(AnimationEventBase) }, null); + if (method != null) + { + object[] param = new object[] { e }; + method.Invoke(this, param); + } + } + } + + #region Event handle + + void EventEffect(AnimationEventBase animEvent) + { + EventEffect effect = animEvent as EventEffect; + if (effect == null) + return; + string path = effect.effectPath; +#if UNITY_EDITOR + GameObject prefab = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject; + if (prefab != null) + { + GameObject root = new GameObject(); + + GameObject go = GameObject.Instantiate(prefab); + go.transform.SetParent(root.transform); + FxClear onClear = root.AddComponent(); + onClear.RunInEditor = true; + onClear.Initialize(new PlayEffectInfo(path, EffectPlayTypes.Oneshot, transform, effect.position, effect.rotation, effect.scale, 0, false)); + } +#endif + } + + void EventCamera_Shake(AnimationEventBase animEvent) + { + + } + + #endregion +} \ No newline at end of file diff --git a/Assets/Scripts/Unit/UnitTimeline.cs.meta b/Assets/Scripts/Unit/UnitTimeline.cs.meta new file mode 100644 index 00000000..eacf2ed1 --- /dev/null +++ b/Assets/Scripts/Unit/UnitTimeline.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7bb2f04adc210b04dad020a77628fe79 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- cgit v1.1-26-g67d0