传统消息分发机制,事件都是很分散的,没有形成统一的管理,事件都是在消息发送的那一端定义的,其它类需要接收消息的,绑定到这个静态事件就行,这种方式一个很大的特点就是很灵活
之前写过一篇文章:
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)