关闭

事件与委托---实现事件分发中心

标签: delegatec#unity游戏
253人阅读 评论(0) 收藏 举报
分类:

写在前面

在看一个商业源码的时候,突然发现有一个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();
        }
    }
}








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1390次
    • 积分:75
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论