1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
using System;
using System.Collections;
using System.Reflection;
using System.Collections.Generic;
using UnityEngine;
// 执行帧事件
[DisallowMultipleComponent]
public partial class TimelineEventProxy
{
#if UNITY_EDITOR // ActionTool里
private static GameObject m_Root_Particles;
public static GameObject Root_Particles
{
get
{
if (m_Root_Particles == null)
{
m_Root_Particles = GameObject.Find("Root_Particles");
if(m_Root_Particles == null)
m_Root_Particles = new GameObject("Root_Particles");
}
return m_Root_Particles;
}
}
private static GameObject m_Root_Projectiles;
public static GameObject Root_Projectiles
{
get
{
m_Root_Projectiles = GameObject.Find("Root_Projectiles");
if (m_Root_Projectiles == null)
m_Root_Projectiles = new GameObject("Root_Projectiles");
return m_Root_Projectiles;
}
}
public bool isInEditMode;
public delegate void RegisterProjectileHandle(Projectile projectile);
public RegisterProjectileHandle registerProjectile;
public delegate void RegisterParticleSystemHandle(FxClear vfx);
public RegisterParticleSystemHandle registerParticleSystem;
#endif
// 不要序列化枚举值,因为可能会随时更改
public enum EEventType
{
EventGame_TimeScale, // 缩放时间
EventMesh_ImageEffect_MotionBlur, // 运动模糊
EventMesh_ImageEffect_Glitch, // glitch
EventMesh_LensEffect_Bloom, // bloom
EventMesh_LensEffect_MotionBlur, // motionBlur
EventMesh_PostEffect_Curly, //
EventMesh_AfterImage, // 角色残像
EventMesh_AfterImageStop, // 角色残像停止事件
EventMesh_FadeIn, // 角色透明度
EventMesh_FadeOut, // 角色透明度
EventMesh_Gloss, // 角色泛光
EventMesh_VisibilityInMainCamera, // 是否在主相机渲染
EventUnit_SetPosition, // 设置位置
EventUnit_BulletTime, // 子弹时间
EventCamera_Zoom, // 相机聚焦
EventCamera_Shake, // 相机晃动
EventCamera_Blur, // 相机模糊
EventCamera_WhiteOut, // 相机白屏
EventEnv_Dark,
EventEnv_Exposure,
EventUI_Drift, //
EventUI_Blur, //
EventProjectile, // 发射体
EventEffect, // 特效
EventSound, // 音效
}
public const int FPS = 30; // timeline 每秒采样30次
private int m_PrevFrame = -1;
private Transform m_Root;
private Transform m_UnitModel; // 模型的Unit prefab,默认是m_Root的第一个子节点
public UnitController owner { get; private set; }
private UnitAnimation m_UnitAnimation { get { return owner.unitAnimation; } }
private AnimationData m_PrevAnimationData;
public TimelineEventProxy( UnitController owner)
{
this.owner = owner;
m_Root = owner.transform;
m_PrevAnimationData = null;
m_UnitModel = m_Root.GetChild(0);
}
public TimelineEventProxy(Transform root)
{
m_Root = root;
m_PrevAnimationData = null;
m_UnitModel = m_Root.GetChild(0);
}
public static Type GetTypeByName(string name)
{
Type type = Type.GetType(name);
return type;
}
public void ResetPrevAnimationData()
{
m_PrevAnimationData = null;
}
public void ExecuteAnimationEvents(AnimationData animData, float animFrame)
{
if (animData == null)
return;
int frame = (int)animFrame;
if (m_PrevAnimationData != animData)
{
m_PrevFrame = frame;
m_PrevAnimationData = animData;
}
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);
if(owner != null)
owner.onTimelineEvent(e);
}
}
}
}
|