diff options
Diffstat (limited to 'Assets/Scripts/Unit/UnitTimeline.cs')
-rw-r--r-- | Assets/Scripts/Unit/UnitTimeline.cs | 115 |
1 files changed, 115 insertions, 0 deletions
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<int> framesHasEvent = animData.GetAnimationEventFrameIndices();
+ if (framesHasEvent.Contains(i))
+ {
+ List<AnimationEventBase> events = animData.GetAnimationEventsAtFrame(i);
+ ExecuteEvents(events);
+ ListPool<AnimationEventBase>.Release(events);
+ }
+ ListPool<int>.Release(framesHasEvent);
+ }
+ }
+ m_PrevFrame = frame;
+ }
+
+ void ExecuteEvents(List<AnimationEventBase> 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<FxClear>();
+ 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 |