unity消息系统机制,工具类可以直接使用
来源:互联网 发布:手机游戏端口 编辑:程序博客网 时间:2024/05/22 04:38
转自:http://www.manew.com/blog-117699-43032.html
using System.Collections;using System.Collections.Generic;using UnityEngine;public enum CEventType{ GAME_OVER, GAME_WIN, PAUSE, GAME_DATA,}public class CBaseEvent{ protected Hashtable arguments; protected CEventType type; protected object sender; protected string eventName; public CEventType Type { get { return this.type; } set { this.type = value; } } public IDictionary Params { get { return this.arguments; } set { this.arguments = (value as Hashtable); } } public object Sender { get { return this.sender; } set { this.sender = value; } } public string EventName { get { return eventName; } set { eventName = value; } } public override string ToString() { return this.type + " { " + ((this.sender == null) ? "null" : this.sender.ToString()) + " } "; } public CBaseEvent Clone() { return new CBaseEvent(this.type, this.arguments, Sender); } public CBaseEvent(CEventType type, object sender) { this.Type = type; Sender = sender; if (this.arguments == null) { this.arguments = new Hashtable(); } } public CBaseEvent(CEventType type, Hashtable args, object sender) { this.Type = type; this.arguments = args; Sender = sender; if (this.arguments == null) { this.arguments = new Hashtable(); } } public CBaseEvent(string eventName, object sender) { this.EventName = eventName; Sender = sender; if (this.arguments == null) { this.arguments = new Hashtable(); } }}
using System;using System.Collections;using System.Collections.Generic;using UnityEngine;public delegate void CEventListenerDelegate(CBaseEvent evt);public class CEventDispatcher{ static CEventDispatcher instance; public static CEventDispatcher GetInstance() { if (instance == null) { instance = new CEventDispatcher(); } return instance; } private Hashtable listeners = new Hashtable(); public void AddEventListener(CEventType eventType, CEventListenerDelegate listener) { CEventListenerDelegate ceventListenerDelegate = this.listeners[eventType] as CEventListenerDelegate; ceventListenerDelegate = (CEventListenerDelegate)Delegate.Combine(ceventListenerDelegate, listener); this.listeners[eventType] = ceventListenerDelegate; } public void RemoveEventListener(CEventType eventType, CEventListenerDelegate listener) { CEventListenerDelegate ceventListenerDelegate = this.listeners[eventType] as CEventListenerDelegate; if (ceventListenerDelegate != null) { ceventListenerDelegate = (CEventListenerDelegate)Delegate.Remove(ceventListenerDelegate, listener); } this.listeners[eventType] = ceventListenerDelegate; } public void AddEventListener(string eventName, CEventListenerDelegate listener) { CEventListenerDelegate ceventListenerDelegate = this.listeners[eventName] as CEventListenerDelegate; //这个combine就相当于委托的+= (整体的实现就是类似于观察者模式) ceventListenerDelegate = (CEventListenerDelegate)Delegate.Combine(ceventListenerDelegate, listener); this.listeners[eventName] = ceventListenerDelegate; } public void RemoveEventListener(string eventName, CEventListenerDelegate listener) { CEventListenerDelegate ceventListenerDelegate = this.listeners[eventName] as CEventListenerDelegate; if (ceventListenerDelegate != null) { ceventListenerDelegate = (CEventListenerDelegate)Delegate.Remove(ceventListenerDelegate, listener); } this.listeners[eventName] = ceventListenerDelegate; } public void DispatchEventOnce(CBaseEvent evt) { CEventListenerDelegate ceventListenerDelegate; if (string.IsNullOrEmpty(evt.EventName)) { ceventListenerDelegate = this.listeners[evt.Type] as CEventListenerDelegate; } else { ceventListenerDelegate = this.listeners[evt.EventName] as CEventListenerDelegate; } if (ceventListenerDelegate != null) { try { ceventListenerDelegate(evt); if (string.IsNullOrEmpty(evt.EventName)) { this.listeners.Remove(evt.Type); } else { this.listeners.Remove(evt.EventName); } } catch (Exception ex) { throw new Exception(string.Concat(new string[] { "Error dispatching event ", evt.Type.ToString(), ": ", ex.Message, " ", ex.StackTrace }), ex); } } } ////// 使用枚举传递 /// /// public void DispatchEvent(CBaseEvent evt) { CEventListenerDelegate ceventListenerDelegate = this.listeners[evt.Type] as CEventListenerDelegate; if (ceventListenerDelegate != null) { try { ceventListenerDelegate(evt); } catch (Exception ex) { throw new Exception(string.Concat(new string[] { "Error dispatching event ", evt.Type.ToString(), ": ", ex.Message, " ", ex.StackTrace }), ex); } } } ////// 使用字符串传递 /// /// public void DispatchStringEvent(CBaseEvent evt) { CEventListenerDelegate ceventListenerDelegate = this.listeners[evt.EventName] as CEventListenerDelegate; if (ceventListenerDelegate != null) { try { ceventListenerDelegate(evt); } catch (Exception ex) { throw new Exception(string.Concat(new string[] { "Error dispatching event ", evt.Type.ToString(), ": ", ex.Message, " ", ex.StackTrace }), ex); } } } public void RemoveAll() { this.listeners.Clear(); }}
3.一共就这2个类就可以了,接下来是使用方法
using UnityEngine;using System.Collections;public class TestEvent : MonoBehaviour {// Use this for initializationvoid Start () { CEventDispatcher.GetInstance().AddEventListener("开始触发", MyTestFunc); CEventDispatcher.GetInstance().AddEventListener(CEventType.GAME_WIN, MyTestFunc); CEventDispatcher.GetInstance().DispatchEventOnce(new CBaseEvent("开始触发","第一次")); CEventDispatcher.GetInstance().DispatchStringEvent(new CBaseEvent("开始触发", "第三次")); CEventDispatcher.GetInstance().DispatchEvent(new CBaseEvent(CEventType.GAME_WIN, "事件类型")); } void MyTestFunc(CBaseEvent evt) { Debug.Log("触发了该方法:"+ evt.Sender.ToString()); }}
阅读全文
0 0
- unity消息系统机制,工具类可以直接使用
- OKhttp的封装工具类(可以直接使用)
- CSS格式化工具-直接可以使用
- SQLServer2005中的异常处理消息框可以直接使用
- unity消息机制实现
- Unity消息机制
- Unity中的消息机制
- Unity消息机制
- java文件工具类FileUtils的使用(直接饮用就可以使用)
- Dom4j处理大数据的工具类(直接可以使用)
- 获取系统消息工具类
- Unity 消息发送机制 解析
- Hibernate中可以直接来调用session,不需要工具类
- android 可以直接拿去用的工具类方法
- Java 日期工具类 (可以直接调用)
- Unity 怎么得到一个可以直接使用的对象与另一个对象之间的Float夹角
- Unity 使用 Unity 直接编译外部 DLL
- Unity 3D 消息事件系统 NotificationCenter、CEventDispatcher事件分发机制
- 欢迎使用CSDN-markdown编辑器
- C#进阶 17 Try-Catch 异常处理
- 在elementUI中使用 el-autocomplete 实现远程搜索的下拉框
- java 防止 XSS 攻击的常用方法总结.
- 多线程交替执行
- unity消息系统机制,工具类可以直接使用
- 阿斯麦电面 面经(附自己的一些总结)
- HTML表单元素
- 为服务器上的图片生成二维码
- IntellJ IDEA+Spring Boot+JSP
- 关于js的报错处理
- lua写入一个不确定是否存在文件的方法
- 求树的直径
- 从CNN视角看在自然语言处理上的应用