写在前面
在看一个商业源码的时候,突然发现有一个EventDispatcher类,而且这个类异常庞大,职责就是把这个项目的全部事件都在里面声明。看着那么高大上的事件分发中心,我也只能马上加到我的项目里面来提升一下逼格了。
知识准备
首先是这个事件分发中心的知识,就是用事件和委托来实现方法的回调。那么什么是事件呢,事件和委托又有什么剪不断理还乱的关系呢???
delegate:委托,c#中的代理和c++的函数指针很像,如果熟悉c++的话应该很容易理解,c#用代理的形式实现了函数指针,但是delegate的功能要多很多,比如,delegate确保回调方法是类型安全的。delegate就是一个类,c#通过委托来提供回调函数机制
event:事件,事件在代理模型上添加了一层保护,如下面的例子,levelUp是一个代理,levelupEvent事件的声明做了两件事情,一、它声明了一个名为levelupEvent的代理成员变量,在类的内部里面可以使用,二、它声明了一个名为levelupEvent的公共事件,这样的话该事件可以从类的外部使用。我们就可以实现观察者模式。
public delegate void levelUp();
public event levelUp levelupEvent;
public void OnLevelUp()
{
if (levelupEvent != null)
{
levelupEvent();
}
}代码实现
比如现在穿上一件装备,要在人物属性面板上同步更新属性的增益值,就可以在事件分发中心EventDispatcher这样定义
/// <summary>
/// 装备穿上的事件
/// </summary>
public delegate void EquipPutOn();
public event EquipPutOn EquipPutOnEvent = null;
public void OnEquipPutOnEvent()
{
if (EquipPutOnEvent != null)
{
EquipPutOnEvent();
}
}
然后在控制人物属性面板的类中用"+="操作符去添加监听方法updateShow来更新显示
void Awake()
{
initUI();
registerEvent();
this.gameObject.SetActive(false);
EventDispatcher.GetInstance().EquipPutOnEvent += this.updateShow;
}
有添加监听方法,自然就有取消注册监听方法,记得在OnDestroy中调用"-="
void OnDestory()
{
EventDispatcher.GetInstance().levelupEvent -= this.updateShow;
}
最后,就是触发这个事件,调用全部登记这个监听的函数<pre class="csharp" name="code"> //穿上装备改变属性
public void putOnEquipChangeAttribute(int id)
{
invertoryInfo info = invertorysInfo.getInvertoryInfoById(id);
if (info.type == invertoryType.EQUI)
{
addPlayerAttributeByEquip(info);
EventDispatcher.GetInstance().OnEquipPutOnEvent();
}
}
<h1><span style="color:#ff0000;">事件分发中心</span></h1><span style="font-size:18px"></span><div>事件分发中心,就是把监听事件统一管理,实现观察者模式,代码如下</div><pre class="csharp" name="code">using UnityEngine;
using System.Collections;
public class EventDispatcher {
static public EventDispatcher Instance;
static public EventDispatcher GetInstance()
{
if (Instance == null)
{
Instance = new EventDispatcher();
}
return Instance;
}
/// <summary>
/// 装备穿上的事件
/// </summary>
public delegate void EquipPutOn();
public event EquipPutOn EquipPutOnEvent = null;
public void OnEquipPutOnEvent()
{
if (EquipPutOnEvent != null)
{
EquipPutOnEvent();
}
}
/// <summary>
/// 角色升级
/// </summary>
public delegate void levelUp();
public event levelUp levelupEvent;
public void OnLevelUp()
{
if (levelupEvent != null)
{
levelupEvent();
}
}
}
本文探讨了C#中的事件和委托概念,重点在于如何利用它们来构建一个事件分发中心,尤其在Unity游戏开发中如何应用。首先,介绍了事件和委托的基础知识,然后详细说明了如何创建和使用事件分发中心,以实现不同组件之间的通信,提高代码的灵活性和可维护性。
952

被折叠的 条评论
为什么被折叠?



