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

image.png

image.png
image.png

代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Events;
  5. /// <summary>
  6. /// 事件中心 单例模式对象
  7. /// 1. Dictionary
  8. /// 2. 委托
  9. /// 3. 观察者设计模式
  10. /// </summary>
  11. public class EventCenter : BaseManager<EventCenter>
  12. {
  13. // key - 事件的名字(比如: 怪物死亡, 玩家死亡, 通关 等等)
  14. // value - 对应的是 监听这个事件 对应的委托函数们
  15. private Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>();
  16. /// <summary>
  17. /// 添加事件监听
  18. /// </summary>
  19. /// <param name="name">事件的名字</param>
  20. /// <param name="action">准备用来处理事件的委托函数</param>
  21. public void AddEventListener(string name, UnityAction<object> action)
  22. {
  23. // 有没有对应的事件监听
  24. // 有的情况
  25. if (eventDic.ContainsKey(name))
  26. {
  27. eventDic[name] += action;
  28. }
  29. // 没有的情况
  30. else
  31. {
  32. eventDic.Add(name,action);
  33. }
  34. }
  35. /// <summary>
  36. /// 移除对应的事件监听
  37. /// </summary>
  38. /// <param name="name">事件的名字</param>
  39. /// <param name="action">对应之前添加的委托函数</param>
  40. public void RemoveEventListener(string name, UnityAction<object> action)
  41. {
  42. if (eventDic.ContainsKey(name))
  43. eventDic[name] -= action;
  44. }
  45. /// <summary>
  46. /// 事件触发
  47. /// </summary>
  48. /// <param name="name">哪一个名字的事件触发</param>
  49. public void EventTrigger(string name, object info)
  50. {
  51. if (eventDic.ContainsKey(name))
  52. {
  53. // 执行监听的所有函数
  54. eventDic[name].Invoke(info);
  55. }
  56. // 不存在则什么都不用做
  57. }
  58. /// <summary>
  59. /// 清空事件中心
  60. /// 主要用于场景切换时
  61. /// </summary>
  62. public void Clear()
  63. {
  64. eventDic.Clear();
  65. }
  66. }

例子

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Monster : MonoBehaviour
  5. {
  6. public string name = "123123";
  7. void Start()
  8. {
  9. Dead();
  10. }
  11. /// <summary>
  12. /// 死亡方法
  13. /// </summary>
  14. void Dead()
  15. {
  16. Debug.Log("怪物死亡");
  17. // // 其他对象想在怪物死亡时做点什么
  18. // // 比如
  19. // // 1.玩家 得奖励
  20. // GameObject.Find("Player").GetComponent<Player>().MonsterDeadDo();
  21. // // 2. 任务记录
  22. // GameObject.Find("Task").GetComponent<Task>().TaskWaitMonsterDeadDo();
  23. // // 3. 其他(比如 成就记录 比如 副本继续创建怪物等等)
  24. // GameObject.Find("Other").GetComponent<Other>().OtherWaitMonsterDeadDo();
  25. // // 加N个处理逻辑
  26. // 触发事件
  27. EventCenter.GetInstance().EventTrigger("MonsterDead", this);
  28. }
  29. }
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. public class Player : MonoBehaviour
  6. {
  7. private void Awake()
  8. {
  9. EventCenter.GetInstance().AddEventListener("MonsterDead",MonsterDeadDo);
  10. }
  11. /// <summary>
  12. /// 怪物死时要做什么
  13. /// </summary>
  14. /// <param name="info"></param>
  15. public void MonsterDeadDo(object info)
  16. {
  17. Debug.Log("玩家得奖励" + (info as Monster).name);
  18. }
  19. private void OnDestroy()
  20. {
  21. EventCenter.GetInstance().RemoveEventListener("MonsterDead",MonsterDeadDo);
  22. }
  23. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Task : MonoBehaviour
  5. {
  6. private void Awake()
  7. {
  8. EventCenter.GetInstance().AddEventListener("MonsterDead",TaskWaitMonsterDeadDo);
  9. }
  10. /// <summary>
  11. /// 怪物死时要做什么
  12. /// </summary>
  13. /// <param name="info"></param>
  14. public void TaskWaitMonsterDeadDo(object info)
  15. {
  16. Debug.Log("任务 记录");
  17. }
  18. private void OnDestroy()
  19. {
  20. EventCenter.GetInstance().RemoveEventListener("MonsterDead",TaskWaitMonsterDeadDo);
  21. }
  22. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Other : MonoBehaviour
  5. {
  6. private void Awake()
  7. {
  8. EventCenter.GetInstance().AddEventListener("MonsterDead",OtherWaitMonsterDeadDo);
  9. }
  10. public void OtherWaitMonsterDeadDo(object info)
  11. {
  12. Debug.Log("其他 各个对象要做的事情");
  13. }
  14. private void OnDestroy()
  15. {
  16. EventCenter.GetInstance().RemoveEventListener("MonsterDead",OtherWaitMonsterDeadDo);
  17. }
  18. }