-
Notifications
You must be signed in to change notification settings - Fork 0
/
EventManager.cs
143 lines (126 loc) · 3.5 KB
/
EventManager.cs
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using System;
public class EventManager : MonoBehaviour
{
private DictionaryByType dictByType;
private static EventManager eventManager;
public static EventManager instance
{
get
{
if (!eventManager)
{
eventManager = FindObjectOfType(typeof(EventManager)) as EventManager;
if (!eventManager)
Debug.LogError("Needs 1 active EventManager script on a GO in your scene!");
else
eventManager.Init();
}
return eventManager;
}
}
void Init()
{
if (dictByType == null)
dictByType = new DictionaryByType();
}
public static void StartListening<T>(string eventName, Action<T> listener)
{
Action<T> thisEvent;
if (instance.dictByType.TryGet(eventName, out thisEvent))
{
thisEvent += listener;
instance.dictByType[eventName] = thisEvent;
}
else
{
thisEvent += listener;
instance.dictByType.Add(eventName, thisEvent);
}
}
public static void StartListening(string eventName, Action listener)
{
Action thisEvent;
if (instance.dictByType.TryGet(eventName, out thisEvent))
{
thisEvent += listener;
instance.dictByType[eventName] = thisEvent;
}
else
{
thisEvent += listener;
instance.dictByType.Add(eventName, thisEvent);
}
}
public static void StopListening<T>(string eventName, Action<T> listener)
{
if (eventManager == null) return;
Action<T> thisEvent;
if (instance.dictByType.TryGet(eventName, out thisEvent))
{
thisEvent -= listener;
instance.dictByType[eventName] = thisEvent;
}
}
public static void StopListening(string eventName, Action listener)
{
if (eventManager == null) return;
Action thisEvent;
if (instance.dictByType.TryGet(eventName, out thisEvent))
{
thisEvent -= listener;
instance.dictByType[eventName] = thisEvent;
}
}
public static void TriggerEvent<T>(string eventName, T eventParam)
{
Action<T> thisEvent = null;
if (instance.dictByType.TryGet(eventName, out thisEvent))
{
thisEvent.Invoke(eventParam);
}
}
public static void TriggerEvent(string eventName)
{
Action thisEvent = null;
if (instance.dictByType.TryGet(eventName, out thisEvent))
{
thisEvent.Invoke();
}
}
}
public class DictionaryByType
{
private readonly IDictionary<string, object> dictionary = new Dictionary<string, object>();
public void Add<T>(string key, T value)
{
dictionary.Add(key, value);
}
public void Put<T>(string key, T value)
{
dictionary[key] = value;
}
public T Get<T>(string key)
{
return (T)dictionary[key];
}
public bool TryGet<T>(string key, out T value)
{
object tmp;
if (dictionary.TryGetValue(key, out tmp))
{
value = (T)tmp;
return true;
}
value = default(T);
return false;
}
public object this[string str]
{
get { return dictionary[str]; }
set { dictionary[str] = value; }
}
}