• 引言:本文主要为介绍基于观察者设计模式的事件中心

事件中心的主要作用

举例抛出问题

  • 现在有这么种情况,怪物死亡往往伴随着任务更新、玩家获得奖励、或者其他等等

    image-20250803102340896
  • 下面为示例代码

    • 怪物代码:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      public class Monster : MonoBehaviour
      {
      // Start is called before the first frame update
      void Start()
      {
      Dead();
      }

      void Dead()
      {
      Debug.Log("怪物死亡了");
      //其他对象在怪物死亡时想做的事情
      //比如
      //1.任务更新
      GameObject.Find("Task").GetComponent<Task>().TaskWaitMonsterDeadDo();
      //2.玩家得奖励
      GameObject.Find("Player").GetComponent<Player>().PlayerWaitMonsterDeadDo();
      //3.其他相关系统
      GameObject.Find("Other").GetComponent<Other>().OtherWaitMonsterDeadDo();
      //n个其他相关处理
      }
      }
    • 玩家代码:

      1
      2
      3
      4
      5
      6
      7
      public class Player : MonoBehaviour
      {
      public void PlayerWaitMonsterDeadDo()
      {
      Debug.Log("玩家得奖励");
      }
      }
    • 任务代码:

      1
      2
      3
      4
      5
      6
      7
      public class Task : MonoBehaviour
      {
      public void TaskWaitMonsterDeadDo()
      {
      Debug.Log("任务记录");
      }
      }
    • 等等代码…..

  • 问题发现:

    • 通过上述代码,我们发现常规的方法就是在怪物死亡时去对各个模块进行更新

    • 我们不难发现这种处理方式,系统、和对象之间的耦合度很高

    • 目前只是怪物死亡的例子,就发现对象和模块之间会出现彼此相互引用和依赖 那么当游戏复杂了,各个系统、模块、对象之间会存在错综复杂的关系 非常不利于我们进行开发。

      image-20250803102856715

事件中心解决的问题

  • 事件中心就是去解决上述问题的
  • 事件中心的主要作用是:
    • 解耦程序模块
    • 降低程序耦合度
    • 它可以降低游戏中不同模块的耦合度
    • 不需要直接引用或依赖于彼此的具体实现

事件中心的基本原理

  • 我们可以通过一个中心化的机制,使多个系统、模块、对象之间可以进行松耦合的通信

    image-20250803103316472

  • 我们可以在怪物和各大模块之间,放置一个事件中心

  • 事件中心可以去通过字典,添加需要监听的事件和订阅的方法,比如:<怪物死亡事件 , 玩家获取奖励>

  • 我们监听者做的只是去订阅该事件,去处理对应逻辑。

  • 当我们一个模块需要对这些事件进行响应时,只需要在这个模块调用事件中心对应的事件即可

  • 我们只需要利用字典和委托相关的知识点 再结合观察者设计模式的基本原理便可以制作出事件中心模块

观察者设计模式

  • 主要原理:

    是定义了一种一对多的依赖关系,使得当一个对象的 状态发生变化时,所有依赖于它的对象都能够得到通知并自动更新