From cb893e1e5e4820cb800836cf6b8a79a1cd986cdc Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 22 Jul 2021 18:34:47 +0800 Subject: *misc --- Assets/Scripts/Unit/TimelineEvent.cs | 107 +++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 16 deletions(-) (limited to 'Assets/Scripts/Unit/TimelineEvent.cs') diff --git a/Assets/Scripts/Unit/TimelineEvent.cs b/Assets/Scripts/Unit/TimelineEvent.cs index f0a28ec6..6a69934b 100644 --- a/Assets/Scripts/Unit/TimelineEvent.cs +++ b/Assets/Scripts/Unit/TimelineEvent.cs @@ -1,6 +1,11 @@ -using System.Collections; +using System; +using System.Collections; +using System.Reflection; using System.Collections.Generic; using UnityEngine; +#if UNITY_EDITOR +using UnityEditor; +#endif // 动画帧事件 [DisallowMultipleComponent] @@ -8,33 +13,103 @@ public partial class TimelineEvent: MonoBehaviour { public enum EEventType { - EventCameraZoom, // 相机聚焦 - EventCameraShake, // 相机晃动 - EventCameraBlur, // 相机模糊 - EventCameraWhiteOut, // 相机白屏 - EventAfterImage, // 角色残像 - EventMeshFade, // 角色透明度 - EventMeshGloss, // 角色泛光 - EventProjectile, // 发射体 - EventEffect, // 特效 - EventSound, // 音效 - EventUIDrift, // + 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; - void EventEffect(EventEffect effect) + private int m_PrevFrame = -1; + + public static Type GetTypeByName(string name) { + Type type = Type.GetType(name); + return type; } - void EventAfterImage(EventAfterImage afterImage) + 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 EventMeshFade(EventMeshFade meshFade) + void EventCamera_Shake(AnimationEventBase animEvent) { } -} \ No newline at end of file + #endregion +} \ No newline at end of file -- cgit v1.1-26-g67d0