Unity3d 简单的消息系统
2017-10-29 15:22
134 查看
游戏开发过程中,消息系统是整个框架中比较重要的一部分,用得好可以使客户端框架“干净整洁”(私以为这个很重要),不然各种交叉访问,耦合度实在是不要太高啊!
EventType是事件类型,EventListenerDelegate是委托;
EventListenerDelegate的参数是EventData;
源代码:
https://gitee.com/xianglinlove/EventManager
点击白色小球,正方体开始运动;
分析:
需要一个全局的消息管理器,用于管理消息,可以添加,移除,清空,分发消息,这样一来,字典Dictionary< EventType, EventListenerDelegate>最合适不过了,当然也可以使用哈希表来做容器;EventType是事件类型,EventListenerDelegate是委托;
EventListenerDelegate的参数是EventData;
/// <summary> /// 消息类型定义 /// </summary> public enum EventType{ GAME_START, GAME_OVER, PAUSE, CLICK_CUBE, }
using System.Collections; /// <summary> /// 基本事件封装 /// </summary> public class EventData { protected Hashtable arguments; private EventType type; protected object sender; public EventType Type { get { return type; } set { type = value; } } public IDictionary Params { get { return arguments; } set { arguments = (Hashtable) value; } } public object Sender { get { return sender; } set { sender = value; } } public override string ToString() { return this.type + "[" + ((this.sender == null) ? "null" : this.sender.ToString() + "]"); } public EventData Clone() { return new EventData(type,arguments,Sender); } public EventData(EventType type, object sender) { this.Type = type; Sender = sender; if (this.arguments == null) { this.arguments = new Hashtable(); } } public EventData(EventType type, Hashtable args, object sender) { this.Type = type; this.arguments = args; Sender = sender; if (this.arguments == null) { this.arguments=new Hashtable(); } } }
using System; using System.Collections.Generic; public delegate void EventListenerDelegate(EventData evt); public class MessageManager { static MessageManager instance; public static MessageManager GetInstance() { if (instance == null) { instance = new MessageManager(); } return instance; } //private Hashtable listeners = new Hashtable(); private Dictionary<EventType, EventListenerDelegate> listeners = new Dictionary<EventType, EventListenerDelegate>(); /// <summary> /// 增加监听 /// </summary> /// <param name="eventType"></param> /// <param name="listener"></param> public void AddEventListener(EventType eventType, EventListenerDelegate listener) { EventListenerDelegate eventListenerDelegate = null; if (!listeners.TryGetValue(eventType, out eventListenerDelegate)) { listeners.Add(eventType, listener); } } /// <summary> /// 移除事件 /// </summary> /// <param name="eventType"></param> /// <param name="listener"></param> public void RemoveEventListener(EventType eventType, EventListenerDelegate listener) { EventListenerDelegate eventListenerDelegate = null; if (listeners.TryGetValue(eventType, out eventListenerDelegate)) { listeners.Remove(eventType); } } /// <summary> /// 分发消息 /// </summary> /// <param name="evt"></param> public void Dispatcher(EventData evt) { EventListenerDelegate eventListenerDelegate = null; if (listeners.TryGetValue(evt.Type, out eventListenerDelegate)) { try { eventListenerDelegate(evt); } catch (Exception e) { throw new Exception(string.Concat(new string[] { "Error dispatcher event", evt.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e); } } } public void RemoveAll() { listeners.Clear(); } }
源代码:
https://gitee.com/xianglinlove/EventManager
点击白色小球,正方体开始运动;
相关文章推荐
- [Unity3D]Unity3D游戏开发之NPC对话系统的简单实现
- [Unity3D]地形系统的创建与简单设置
- 树莓派开发板--Linux系统--ROS环境--实现一个简单的消息发布器和订阅器
- Visual C#建立简单消息传递系统(1)
- 32.Android之消息处理系统Looper、Handler、Thread简单学习
- Unity3D 实现简单的Buff系统
- 消息订阅发布系统Apache Kafka分布式集群环境搭建和简单测试
- Common(五)—— 消息系统(一):简单的EventCenter
- 简单搭建 Apache Kafka 分布式消息系统
- openfire:在openfire上创建简单的消息推送系统
- Unity3d 实现简单的剧情系统
- 最简单的消息推送系统(顶多算是雏形)
- 用消息系统实现分布式事务的简单设想
- Unity3d 简单的Avatar换装系统
- Unity3D---模块划分(一)对话系统的简单实现
- Unity3D开发之系统之间发送消息不能被接受
- Unity3D实现的一个简单的展示系统
- 分布式系统的消息&服务模式简单总结
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
- 消息订阅发布系统Apache Kafka分布式集群环境搭建和简单测试