<!doctype html>
事件中心
设计思路
在游戏中,许多事件之间往往会相互触发,比如“怪物死亡”会调用“玩家经验增加”+"任务记录杀死怪物数”+“其他”等事件。如果是这个逻辑的话,在“怪物死亡”的函数中就需要写调用“其他事件所对应的函数”的代码,同理每一个 “需要调用其他函数的函数” 都需要重复写这些代码,导致每一个函数都与很多个函数关联,逻辑复杂,就增加了函数的耦合度,重复代码太多,维护起来也会特别麻烦。这时候如果有事件中心的话,好处就很明显了。
Unity的SendMessage其实就是一个事件中心思想。
作用
减少函数的耦合度
事件中心就好比是一个中间人,负责监察各个事件的发生,然后去调用 “与之相关的函数” ,这样,就不需要在 “事件所对应的函数” 中编写调用 ”与之相关的函数“ 的代码了,只需被调用的函数委托事件中心:”当某某某事件发生时就调用我“
扩展模块特别容易
比如“怪物死亡”后,往事件中心发送“怪物死亡事件”,其他任何模块可随时监听“怪物死亡事件”,进行UI的展示等等,不会对“怪物死亡”造成依赖关系。
程序变得更加容易维护
不需要的模块,能立马做到热插拔,比如说“怪物死亡”模块本来会导致“任务记录更新”,新需求换了,没有任务更新了,直接把任务更新模块禁用掉即可,不会对其他模块造成任何影响。
使用示例
对任务进度进行监听,显示对应UI。
xxxxxxxxxx
protected 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() | 移除事件中心的所有事件 |