using System; using System.Collections; using System.Reflection; using System.Collections.Generic; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif // 执行帧事件 [DisallowMultipleComponent] public partial class TimelineEventProxy { 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; public const int FPS = 30; // timeline 每秒采样30次 private int m_PrevFrame = -1; private UnitAnimation m_UnitAnimation; private Transform m_Root; public TimelineEventProxy(Transform root, UnitAnimation unitAnimation = null) { m_Root = root; } 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, m_Root, effect.position, effect.rotation, effect.scale, 0, false)); } #endif } void EventCamera_Shake(AnimationEventBase animEvent) { } #endregion }