观察者设计模式(事件中心)
- 引言:本文主要为介绍基于观察者设计模式的事件中心
事件中心的主要作用
举例抛出问题
现在有这么种情况,怪物死亡往往伴随着任务更新、玩家获得奖励、或者其他等等
下面为示例代码
怪物代码:
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("任务记录");
}
}等等代码…..
问题发现:
通过上述代码,我们发现常规的方法就是在怪物死亡时去对各个模块进行更新
我们不难发现这种处理方式,
系统、和对象之间的耦合度很高
目前只是怪物死亡的例子,就发现对象和模块之间会出现彼此相互引用和依赖 那么当游戏复杂了,各个系统、模块、对象之间会存在错综复杂的关系 非常不利于我们进行开发。
事件中心解决的问题
- 事件中心就是去解决上述问题的
- 事件中心的主要作用是:
解耦程序模块
降低程序耦合度
它可以降低游戏中不同模块的耦合度
不需要直接引用或依赖于彼此的具体实现
事件中心的基本原理
我们可以
通过一个中心化的机制,使多个系统、模块、对象之间可以进行松耦合的通信
。
我们可以在怪物和各大模块之间,放置一个事件中心
事件中心可以去通过字典,添加需要监听的事件和订阅的方法,比如:<怪物死亡事件 , 玩家获取奖励>
我们监听者做的只是去订阅该事件,去处理对应逻辑。
当我们一个模块需要对这些事件进行响应时,只需要在这个模块调用事件中心对应的事件即可
我们只需要利用字典和委托相关的知识点 再结合观察者设计模式的基本原理便可以制作出事件中心模块
观察者设计模式
主要原理:
是定义了一种一对多的依赖关系,使得当一个对象的 状态发生变化时,所有依赖于它的对象都能够得到通知并自动更新
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 游戏开发笔记!
评论