标签:unity3d 事件 事件分发 unity event
游戏中经常会要求对象之间的交互,在交互的时候如果是同模块的还好,可以取引用,如果不是,就容易出现各种耦合,不利于项目的开发。
软件开发一般都强调“高内聚,低耦合”,既然如此,上面的问题就应该引起重视,相应的解决方案一般来说都是事件分发。
事件分发的原理一般是使用委托或Action(其实也是委托),用户预先注册指定的事件,我们将这个事件存起来,在用户要求执行指定事件的时候,将对应的事件列表依次执行一遍,有时候项目比较大时,事件的注册及分发量比较大,出于效率考虑,一般会使用Dictionary来存储指定的事件。
这里提供一个最简单的例子,帮助大家理解,实际项目运用时可使用文章后面提供的一些代码或自己编写
例子代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public delegate void Callback(object data);
public class MessageEvent
{
Dictionary<string, List<Callback>> eventDic = new Dictionary<string, List<Callback>>();
List<List<Callback>> funcList = new List<List<Callback>>();
public void f_AddListener(string key, Callback callBack)
{
List<Callback> list = null;
if (eventDic.TryGetValue(key,out list))
{
list.Add(callBack);
}
else
{
list = new List<Callback>();
list.Add(callBack);
funcList.Add(list);
eventDic.Add(key, list);
}
}
public void f_RemoveListener(string key, Callback callBack)
{
List<Callback> list = null;
if (eventDic.TryGetValue(key, out list))
{
list.Remove(callBack);
if (list.Count == 0)
{
eventDic.Remove(key);
funcList.Remove(list);
}
}
else
{
Debug.Log("remove wrong no key");
}
}
public void f_BroadCast(string key,object obj)
{
List<Callback> list = null;
if (eventDic.TryGetValue(key, out list))
{
for (int i = 0; i < list.Count; i++)
{
list[i](obj);
}
}
else
{
Debug.Log("broadcast wrong no key");
}
}
}
参考代码:
Unity3D研究院之通过C#使用Advanced CSharp Messenger
Advanced CSharp Messenger的使用
unity3d wiki
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:unity3d 事件 事件分发 unity event
原文地址:http://blog.csdn.net/suifcd/article/details/48009117