【Unity3D_常用模块】 事件管理器
2015-09-09 00:31
507 查看
</pre><pre name="code" class="csharp">/* * 事件管理器 * Claine * 2015.09.09 * V1.0 * * ******************************************************************************************************************************* * V1.0 * 比较简单,实用的一个事件管理器。还有不足的地方。。 * 例如: * 1.如果在不同脚本上,同时监听,一个事件,并且,是同一个回调函数,那么直能相应其中一个,具体是第一个还是最后一个,没测试。 * 2.只要调用一次,意思是说,抛出事件,执行回调之后,该事件回调,自行销毁。 ******************************************************************************************************************************* * */ using UnityEngine; using System.Collections; using System.Collections.Generic; /// <summary> /// 事件类型定义 /// </summary> public enum EventDefinition { Event_1, Event_2, } /// <summary> /// 事件数据结构 /// </summary> public class EventData { public EventDefinition eventType; public Delegate_EventLogicCallBack callback; } /// <summary> /// 事件管理器 /// EventManager.cs /// </summary> public class EventManager { //单例 private static EventManager _instance; public static EventManager Instance { get { if (_instance == null) { _instance = new EventManager(); } return _instance; } } /// <summary> /// 用于初始化,标记启动时间,建议在运行软件第一步,就调用该函数,生成该类 /// </summary> public void Init() { Debug.Log("事件管理器 ---- 启动成功"); } /// <summary> /// 事件缓存 /// </summary> private List<EventData> callbackList = new List<EventData>(); /// <summary> /// 事件监听 /// </summary> /// <param name="_eventType"></param> /// <param name="_callback"></param> public void AddListener(EventDefinition _eventType, Delegate_EventLogicCallBack _callback) { EventData eventData = callbackList.Find(a=>a.eventType == _eventType);//回调列表中找类型相对应的数据结构 if (eventData == null)//如果不存在,就添加新的数据结构进入缓存 { eventData = new EventData(); eventData.eventType = _eventType; eventData.callback = _callback; callbackList.Add(eventData); } else { eventData.callback += _callback;//已存在,就添加监听到数据结构的委托上 } } /// <summary> /// 移除监听 /// </summary> /// <param name="_eventType"></param> /// <param name="_callback"></param> public void RemoveListener(EventDefinition _eventType,Delegate_EventLogicCallBack _callback) { EventData eventData = callbackList.Find(a => a.eventType == _eventType);//回调列表中找类型相对应的数据结构 if (eventData != null)//如果存在 { eventData.callback -= _callback;//移除监听 if (eventData.callback == null)//该类型是否还有回调,如果没有,移除 callbackList.Remove(eventData); } } /// <summary> /// 调度事件 /// </summary> /// <param name="_eventType"></param> /// <param name="_data"></param> public void DispatchEvent(EventDefinition _eventType,object _data = null) { EventData eventData = callbackList.Find(a => a.eventType == _eventType);//回调列表中找类型相对应的数据结构 if (eventData == null) { Debug.Log("Not Found Event:" + _eventType);//没有找到对应事件类型 } else { eventData.callback(_data);//传入参数,执行回调 } } } //事件委托 public delegate void Delegate_EventLogicCallBack(object _data = null);
比较简单的一个事件管理器。
主要函数:添加监听,移除监听,调度事件。三个函数。。。。
主要变量:事件list,事件结构,回调委托。
缓存的方式很多种,用List<KeyValuePair>,Dictionary<Key,Value>,而这里。我主要用第一种,但是不是用KeyValuePair,这个键值对,,用自己的数据结构。其实没什么区别的。纯粹是个人喜欢而已。
相关文章推荐
- Kinect结合Unity3D引擎开发体感游戏(一)
- Unity3D中脚本的执行顺序和编译顺序
- Unity3D动态对象优化代码分享
- unity3d发布apk在android虚拟机中运行的详细步骤(unity3d导出android apk)
- Unity3D游戏引擎实现在Android中打开WebView的实例
- unity3d调用手机或电脑摄像头
- 分享一个开源的网络游戏服务器架构—HouHai
- Unity3D插件详细评测及教学下载
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- Unity3d TransformPoint 函数研究
- Unity3d 动态加载fbx模型文件
- unity3d地形系统总结