实现一个基于观察者的Unity全局事件系统
时间: 2023-06-17 09:03:26 浏览: 214
在Unity中,我们可以使用C#中的事件(Event)和委托(Delegate)机制来实现一个基于观察者的全局事件系统。
首先,我们可以定义一个委托类型,用于定义事件的回调函数:
```csharp
public delegate void EventHandler();
```
然后,我们可以定义一个静态类,用于管理所有事件:
```csharp
public static class EventManager {
private static Dictionary<string, EventHandler> eventDictionary = new Dictionary<string, EventHandler>();
public static void AddHandler(string eventName, EventHandler handler) {
if (eventDictionary.ContainsKey(eventName)) {
eventDictionary[eventName] += handler;
} else {
eventDictionary[eventName] = handler;
}
}
public static void RemoveHandler(string eventName, EventHandler handler) {
if (eventDictionary.ContainsKey(eventName)) {
eventDictionary[eventName] -= handler;
}
}
public static void TriggerEvent(string eventName) {
if (eventDictionary.ContainsKey(eventName)) {
eventDictionary[eventName]?.Invoke();
}
}
}
```
在这个静态类中,我们使用一个Dictionary来存储所有事件的回调函数,使用AddHandler方法和RemoveHandler方法来添加和移除事件的回调函数,使用TriggerEvent方法来触发事件。
例如,我们可以定义一个名为"PlayerDead"的事件:
```csharp
public class Player : MonoBehaviour {
void Die() {
EventManager.TriggerEvent("PlayerDead");
}
}
```
然后,在其他脚本中,我们可以使用AddHandler方法和RemoveHandler方法来订阅和取消订阅该事件:
```csharp
public class GameManager : MonoBehaviour {
void OnEnable() {
EventManager.AddHandler("PlayerDead", OnPlayerDead);
}
void OnDisable() {
EventManager.RemoveHandler("PlayerDead", OnPlayerDead);
}
void OnPlayerDead() {
Debug.Log("Game Over");
}
}
```
这样,当玩家死亡时,所有订阅了"PlayerDead"事件的脚本都会收到通知,并执行相应的操作。
阅读全文