- 知识点: Dictionary, 委托, 观察者设计模式
- 作用: 降低程序耦合性, 减小程序复杂度


代码
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Events;/// <summary>/// 事件中心 单例模式对象/// 1. Dictionary/// 2. 委托/// 3. 观察者设计模式/// </summary>public class EventCenter : BaseManager<EventCenter>{ // key - 事件的名字(比如: 怪物死亡, 玩家死亡, 通关 等等) // value - 对应的是 监听这个事件 对应的委托函数们 private Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>(); /// <summary> /// 添加事件监听 /// </summary> /// <param name="name">事件的名字</param> /// <param name="action">准备用来处理事件的委托函数</param> public void AddEventListener(string name, UnityAction<object> action) { // 有没有对应的事件监听 // 有的情况 if (eventDic.ContainsKey(name)) { eventDic[name] += action; } // 没有的情况 else { eventDic.Add(name,action); } } /// <summary> /// 移除对应的事件监听 /// </summary> /// <param name="name">事件的名字</param> /// <param name="action">对应之前添加的委托函数</param> public void RemoveEventListener(string name, UnityAction<object> action) { if (eventDic.ContainsKey(name)) eventDic[name] -= action; } /// <summary> /// 事件触发 /// </summary> /// <param name="name">哪一个名字的事件触发</param> public void EventTrigger(string name, object info) { if (eventDic.ContainsKey(name)) { // 执行监听的所有函数 eventDic[name].Invoke(info); } // 不存在则什么都不用做 } /// <summary> /// 清空事件中心 /// 主要用于场景切换时 /// </summary> public void Clear() { eventDic.Clear(); }}
例子
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Monster : MonoBehaviour{ public string name = "123123"; void Start() { Dead(); } /// <summary> /// 死亡方法 /// </summary> void Dead() { Debug.Log("怪物死亡"); // // 其他对象想在怪物死亡时做点什么 // // 比如 // // 1.玩家 得奖励 // GameObject.Find("Player").GetComponent<Player>().MonsterDeadDo(); // // 2. 任务记录 // GameObject.Find("Task").GetComponent<Task>().TaskWaitMonsterDeadDo(); // // 3. 其他(比如 成就记录 比如 副本继续创建怪物等等) // GameObject.Find("Other").GetComponent<Other>().OtherWaitMonsterDeadDo(); // // 加N个处理逻辑 // 触发事件 EventCenter.GetInstance().EventTrigger("MonsterDead", this); }}
using System;using System.Collections;using System.Collections.Generic;using UnityEngine;public class Player : MonoBehaviour{ private void Awake() { EventCenter.GetInstance().AddEventListener("MonsterDead",MonsterDeadDo); } /// <summary> /// 怪物死时要做什么 /// </summary> /// <param name="info"></param> public void MonsterDeadDo(object info) { Debug.Log("玩家得奖励" + (info as Monster).name); } private void OnDestroy() { EventCenter.GetInstance().RemoveEventListener("MonsterDead",MonsterDeadDo); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Task : MonoBehaviour{ private void Awake() { EventCenter.GetInstance().AddEventListener("MonsterDead",TaskWaitMonsterDeadDo); } /// <summary> /// 怪物死时要做什么 /// </summary> /// <param name="info"></param> public void TaskWaitMonsterDeadDo(object info) { Debug.Log("任务 记录"); } private void OnDestroy() { EventCenter.GetInstance().RemoveEventListener("MonsterDead",TaskWaitMonsterDeadDo); }}
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Other : MonoBehaviour{ private void Awake() { EventCenter.GetInstance().AddEventListener("MonsterDead",OtherWaitMonsterDeadDo); } public void OtherWaitMonsterDeadDo(object info) { Debug.Log("其他 各个对象要做的事情"); } private void OnDestroy() { EventCenter.GetInstance().RemoveEventListener("MonsterDead",OtherWaitMonsterDeadDo); }}