<!doctype html>
事件中心
设计思路
在游戏中,许多事件之间往往会相互触发,比如“怪物死亡”会调用“玩家经验增加”+"任务记录杀死怪物数”+“其他”等事件。如果是这个逻辑的话,在“怪物死亡”的函数中就需要写调用“其他事件所对应的函数”的代码,同理每一个 “需要调用其他函数的函数” 都需要重复写这些代码,导致每一个函数都与很多个函数关联,逻辑复杂,就增加了函数的耦合度,重复代码太多,维护起来也会特别麻烦。这时候如果有事件中心的话,好处就很明显了。
Unity的SendMessage其实就是一个事件中心思想。
作用
减少函数的耦合度
事件中心就好比是一个中间人,负责监察各个事件的发生,然后去调用 “与之相关的函数” ,这样,就不需要在 “事件所对应的函数” 中编写调用 ”与之相关的函数“ 的代码了,只需被调用的函数委托事件中心:”当某某某事件发生时就调用我“
扩展模块特别容易
比如“怪物死亡”后,往事件中心发送“怪物死亡事件”,其他任何模块可随时监听“怪物死亡事件”,进行UI的展示等等,不会对“怪物死亡”造成依赖关系。
程序变得更加容易维护
不需要的模块,能立马做到热插拔,比如说“怪物死亡”模块本来会导致“任务记录更新”,新需求换了,没有任务更新了,直接把任务更新模块禁用掉即可,不会对其他模块造成任何影响。
使用示例
对任务进度进行监听,显示对应UI。
xxxxxxxxxxprotected override void OnAwake(){ base.OnAwake(); EgoEventCenter.AddListener<TaskChangedData>(EventName.TaskCompleted,OnCompletedTasked); EgoEventCenter.AddListener<TaskChangedData>(EventName.TaskAccepted,OnAcceptedTasked);}protected override void OnDestroy(){ base.OnDestroy(); EgoEventCenter.RemoveListener<TaskChangedData>(EventName.TaskCompleted,OnCompletedTasked); EgoEventCenter.RemoveListener<TaskChangedData>(EventName.TaskAccepted,OnAcceptedTasked);}private void OnAcceptedTasked(TaskChangedData value){ var taskChangedData= value; TaskVO dataBy = ConfigManager.taskMainData.GetDataBy(taskChangedData.taskId); //主线任务不需要接受任务提示 if (dataBy.TaskType==TaskType.Main) { return; } string showValue = "接受任务: "+dataBy.TaskName; var taskTitlePlayItem = new TaskTitlePlayItem(){color = Color.white,stringValue =showValue }; TaskTitlePlayItems.Add(taskTitlePlayItem); if (!isPlaying) { ShowNew(); }}private void OnCompletedTasked(TaskChangedData value){ var taskChangedData= value; string showValue = "完成任务: "+ConfigManager.taskMainData.GetDataBy(taskChangedData.taskId).TaskName; var taskTitlePlayItem = new TaskTitlePlayItem(){color = new Color(0.82f, 0.61f, 0.24f),stringValue =showValue }; TaskTitlePlayItems.Add(taskTitlePlayItem); if (!isPlaying) { ShowNew(); }}接口介绍
EgoEventCenter类
EgoEventCenter是游戏中共用的一个事件中心,如需自己创建特地区域的事件中心,可以new EventCenter()即可创建。
| 接口名 | 说明 |
|---|---|
| PostEvent(string eventName) | 发送无参数事件 |
| PostEvent | 发送一个带参数事件 |
| PostEvent<T1, T2>(string eventName, T1 value1, T2 value2) | 发送两个带参数事件 |
| PostEvent<T1, T2, T3>(string eventName, T1 value1, T2 value2, T3 value3) | 发送三个带参数事件 |
| AddListener(string eventName, EventHandle handle) | 监听无参数事件 |
| AddListener(string eventName, EventHandle | 监听一个参数事件 |
| AddListener | 监听一个参数事件 |
| AddListener<T1, T2>(string eventName, EventHandle<T1, T2> handle) | 监听两个参数事件 |
| AddListener<T1, T2, T3>(string eventName, **EgoEventCenter**全局 **EventCenter**部分 EventHandle<T1, T2, T3> handle) | 监听三个参数事件 |
| RemoveListener(string eventName, EventHandle handle) | 移除无参数事件 |
| RemoveListener(string eventName, EventHandle | 移除一个参数事件 |
| RemoveListener | 移除一个参数事件 |
| RemoveListener<T1, T2>(string eventName, EventHandle<T1, T2> handle) | 移除两个参数事件 |
| RemoveListener<T1, T2, T3>(string eventName, EventHandle<T1, T2, T3> handle) | 移除三个参数事件 |
| RemoveEvent(string eventName) | 移除对应事件的所有监听 |
| RemoveAllEvent() | 移除事件中心的所有事件 |