summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/TimelineEventProxy.cs
blob: cb30e9006250924278d2e0aec26fbfca8cb633d3 (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
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_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; } }

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

    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, m_Root, effect.position, effect.rotation, effect.scale, 0, false));
        }
#endif
    }

    void EventCamera_Shake(AnimationEventBase animEvent)
    {

    }

	#endregion
}