Event System - Dispatcher 消息派发插件的使用

传统消息分发机制,事件都是很分散的,没有形成统一的管理,事件都是在消息发送的那一端定义的,其它类需要接收消息的,绑定到这个静态事件就行,这种方式一个很大的特点就是很灵活


这里写图片描述



之前写过一篇文章:
http://blog.csdn.net/qq_15267341/article/details/60462943


可以把整个项目的事件注册和转发 做为一个模块 ,独立出来,这样就形成一个事件派发的插件


插件要做两件事:
第一定 消息的格式
第二 维护一个字典



以下是我自己写的一个简单的事件派发插件:
这里写图片描述



这个是消息模型,用于封装发和收的数据:

using UnityEngine;
using System.Collections;

public class message  {
    public GameObject obj;    //发送对象
    public object data;      //发送数据
}


下面这个类 ,是事件分发最主要的类:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class messageDepacher : MonoBehaviour {
    public delegate void hanlder (message msg);//定义一个委托
    public static Dictionary<string, hanlder> dic = new Dictionary<string, hanlder>();
    // Use this for initialization
    void Awake()
    {
        print("hhjk");
        dic = new Dictionary<string, hanlder>();
    }

    public static void addListener(string type,hanlder hlder)  //注册
    {
        if (!dic.ContainsKey(type))
        {
            dic.Add(type, null);
        }
        dic[type] += hlder;
    }

    public static void sendMessage(string type ,message msg) //派发消息
    {
        if (dic.ContainsKey(type))
        {
            dic[type](msg);
        }
    }
}

注册事件,拖动到场景中一个物体上

using UnityEngine;
using System.Collections;

public class add01 : MonoBehaviour {

    // Use this for initialization
    void Start () {
        messageDepacher.addListener("xuhaitao", jieShou01);
    }

    public void jieShou01(message msg)
    {
        print("add01:  " + msg.data);
    }
}

拖动到场景中一个物体上,用于注册事件

using UnityEngine;
using System.Collections;

public class add02 : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        messageDepacher.addListener("xuhaitao", jieShou02);
    }


    public void jieShou02(message msg)
    {
        print("add02:  " + msg.data);
    }
}

拖动到场景中一个物体上,用于注册事件

using UnityEngine;
using System.Collections;

public class add03 : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        messageDepacher.addListener("xuhaitao", jieShou03);
    }


    public void jieShou03(message msg)
    {
        print("add03:  " + msg.data);
    }
}

写个测试类:

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            message hh = new message();
            hh.obj = gameObject;
            hh.data = "i am xuhaitao" ;
            messageDepacher.sendMessage("xuhaitao", hh);
        }
    }
}


最后运行场景,然后左键点击屏幕:
这里写图片描述


FR:海涛高软(QQ技术交流群:386476712)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值