summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/TimelineEventProxy.cs
blob: 825cf5bf25dbf8a30badced28cda1f66831d4ba3 (plain)
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里
    public bool isInEditMode;
    public delegate void RegisterProjectileHandle(Projectile projectile);
    public RegisterProjectileHandle registerProjectile;
#endif

    public enum EEventType
    {
        EventCamera_Zoom,     // 相机聚焦
        EventCamera_Shake,    // 相机晃动
        EventCamera_Blur,     // 相机模糊
        EventCamera_WhiteOut, // 相机白屏

        EventMesh_AfterImage, // 角色残像
		EventMesh_FadeIn,     // 角色透明度
		EventMesh_FadeOut,    // 角色透明度
        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 Transform m_Root;

	private UnitController m_Owner;

	private UnitAnimation m_UnitAnimation { get { return m_Owner.unitAnimation; } }

    private AnimationData m_PrevAnimationData;

    public TimelineEventProxy(Transform root, UnitController owner = null)
	{
		m_Root = root;
		m_Owner = owner;
        m_PrevAnimationData = null;
    }

    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 (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);
            }
        }
    }

    void EventEffect(AnimationEventBase animEvent)
    {
        EventEffect effect = animEvent as EventEffect;
        if (effect == null)
            return;
        string path = effect.effectPath;
        GameObject prefab = ResourceManager.Instance.LoadAsset<GameObject>(path);
        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, m_Root, effect.position, effect.rotation, effect.scale, 0, false));
        }
    }

    void EventCamera_Shake(AnimationEventBase animEvent)
    {

    }

    void EventProjectile(AnimationEventBase animEvent)
    {
        EventProjectile e = animEvent as EventProjectile;
        if (e == null)
            return;
        string projectilePath = e.projectilePath;
        GameObject prefab = ResourceManager.Instance.LoadAsset<GameObject>(projectilePath);
        if(prefab == null)
        {
            LogHelper.LogError("缺少对应的projectile, " + projectilePath);
            return;
        }
        if(prefab.GetComponent<Projectile>() == null)
        {
            LogHelper.LogError("没有projectile脚本");
            return;
        }
        GameObject obj = GameObject.Instantiate(prefab);
        Projectile projectile = obj.GetComponent<Projectile>();
        ProjectileInfo info = new ProjectileInfo();
        info.owner = m_Owner;
        info.position = m_Root.transform.position + e.posOffset;
        info.rotation = e.rotation;
        info.scale = e.scale;
        info.direction = Vector3.right;
        info.velocity = Vector3.right * 10f;
        info.lifetime = 5;
        info.sparkPath = e.sparkPath;
        projectile.Initialize(info);

#if UNITY_EDITOR
        if(isInEditMode && registerProjectile != null)
        {
            registerProjectile(projectile);
        }
#endif
    }

}