Unity消息机制
来源:互联网 发布:java如何输出 编辑:程序博客网 时间:2024/06/05 02:12
Unity消息机制
在游戏设计中一定要考虑降低模块与模块之间,代码与代码之间的耦合度
using UnityEngine;using System.Collections.Generic;public delegate void CallBackDelegate(params object[] paramList);public class MessageCenter{ /// <summary> /// 消息名与MessageHandler的映射 /// </summary> private Dictionary<string, List<MessageHandler>> msgHandlersDic; private static MessageCenter _msgInstance; /// <summary> /// 获取单例 /// </summary> public static MessageCenter msgInstance { get { if (_msgInstance == null) { _msgInstance = new MessageCenter(); Debug.Log("创建了一个messageCenter"); } return _msgInstance; } } public MessageCenter() { msgHandlersDic = new Dictionary<string, List<MessageHandler>>(); } /// <summary> /// 注册一个游戏对象成为观察者 /// </summary> /// <param name="observer">this 观察者</param> /// <param name="msgName">消息名</param> /// <param name="callback">响应此消息的事件,用于接收消息</param> /// <param name="priority">响应此消息的事件的优先级</param> public void RegObserver(Component observer, string msgName, CallBackDelegate callback, int priority) { RegObserver(msgName, new MessageHandler(observer, callback, priority)); } /// <summary> /// 注册一个游戏对象成为观察者 /// </summary> /// <param name="msgName">消息名</param> /// <param name="handler">观察者和观察者响应的事件</param> public void RegObserver(string msgName, MessageHandler handler) { if (msgName == null || handler.callback == null) return; if (!msgHandlersDic.ContainsKey(msgName)) { msgHandlersDic[msgName] = new List<MessageHandler>(); msgHandlersDic[msgName].Add(handler); return; } //判断是否已经注册过相同的观察者和响应事件 foreach (MessageHandler item in msgHandlersDic[msgName]) { if (handler == item) return; } //添加一个新的观察者进入观察者队列,并根据优先级排序 for (int i = 0; i < msgHandlersDic[msgName].Count; i++) { if (msgHandlersDic[msgName][i].priority > handler.priority) { msgHandlersDic[msgName].Insert(i, handler); return; } } msgHandlersDic[msgName].Add(handler); } /// <summary> /// 移除观察者 /// </summary> /// <param name="observer">this,移除自身观察者身份</param> /// <param name="msgName">消息名</param> /// <param name="callback">响应此消息的事件,用于接收消息</param> /// <param name="priority">响应此消息的事件的优先级</param> /// <returns></returns> public bool RemoveObserver(Component observer, string msgName, CallBackDelegate callback) { if (msgName == null || callback == null) return false; if (!msgHandlersDic.ContainsKey(msgName)) return false; foreach(MessageHandler item in msgHandlersDic[msgName]) { if (item.observer == observer && item.callback == callback) return msgHandlersDic[msgName].Remove(item); } return false; } /// <summary> /// 移除观察者 /// </summary> /// <param name="msgName">消息名</param> /// <param name="handler">观察者和观察者响应的事件</param> /// <returns></returns> public bool RemoveObserver(string msgName, MessageHandler handler) { if (msgName == null || handler.callback == null) return false; if (!msgHandlersDic.ContainsKey(msgName)) return false; bool result = msgHandlersDic[msgName].Remove(handler); if (msgHandlersDic[msgName].Count == 0) msgHandlersDic.Remove(msgName); return result; } /// <summary> /// 发送消息 /// </summary> /// <param name="msgName">消息名</param> /// <param name="paramArray">发送的消息参数</param> public void SendMessage(string msgName, params object[] paramArray) { if (!msgHandlersDic.ContainsKey(msgName) || msgName == null) return; List<MessageHandler> handlersToRemove = new List<MessageHandler>(); foreach (MessageHandler item in msgHandlersDic[msgName]) { { if (item.observer.gameObject.activeInHierarchy == false) { handlersToRemove.Add(item);//如果当前观察者对象已经被destroy或者disable,移除此观察者 } else item.callback(paramArray);//否则,执行接受消息后的响应事件 } } foreach (MessageHandler item in handlersToRemove) msgHandlersDic[msgName].Remove(item); } ~MessageCenter() { msgHandlersDic = null; Debug.Log("执行析构了"); }}/// <summary>/// 观察者与响应事件封装类/// </summary>public class MessageHandler{ private Component _observer;//任何游戏对象都可以成为观察者 private CallBackDelegate _callback;//接收消息后,响应的事件 private int _priority;//响应事件优先级 public Component observer { get { return _observer; } } public CallBackDelegate callback { get { return _callback; } } public int priority { get { return _priority; } } public MessageHandler(Component observer, CallBackDelegate callback,int priority) { _observer = observer; _callback = callback; _priority = priority; }}
测试
using UnityEngine;using System.Collections;public class ObserverOne : MonoBehaviour{ void OnEnable() { //注册自身成为观察者 MessageCenter.msgInstance.RegObserver(this, "testMsg", ReceiveMsg, 1); } public void ReceiveMsg(params object[] msg) { Debug.Log(this.name +" 接受到了: "+ msg[0]); }}using UnityEngine;using System.Collections;public class ObserverTwo : MonoBehaviour{ void OnEnable() { //注册自身成为观察者 MessageCenter.msgInstance.RegObserver(this, "testMsg", ReceiveMsg, 2); } public void ReceiveMsg(params object[] msg) { Debug.Log(this.name + " 接受到了: " + msg[0]); }}using UnityEngine;using System.Collections;public class Test : MonoBehaviour { /// <summary> /// 按钮点击方法 /// </summary>public void ClickAndSendMsg() { MessageCenter.msgInstance.SendMessage("testMsg", "这是一条消息"); }}
将ClickAndSendMsg方法绑定到测试按钮上,测试结果
阅读全文
0 0
- unity消息机制实现
- Unity消息机制
- Unity中的消息机制
- Unity消息机制
- Unity 消息发送机制 解析
- Unity 客户端框架(三):消息机制
- 【Unity】线程安全的消息传输机制,仿照Cocos实现
- Unity 5 事件/消息机制之UnityEvent类型
- Unity 游戏框架搭建 (五) 简易消息机制
- 在unity中用UDP实现发送消息机制
- Unity 游戏框架搭建 (五) 简易消息机制
- unity消息系统机制,工具类可以直接使用
- Unity 游戏框架搭建 (五) 简易消息机制
- 消息机制
- 消息机制
- 消息机制
- 消息机制
- 消息机制
- Learning to Rank简介
- 湖南省赛A题
- 第十届ACM省赛-C 最小秘钥
- Java进击C#——项目开发环境
- UML---用例图
- Unity消息机制
- CORS 跨域 实现思路及相关解决方案
- C++抽象编程——指针(2)——特殊的指针
- Java进击C#——开发环境
- Unique Paths
- Android开发官方语言-Kotlin学习资源汇总
- MyFlag Step5:用户功能
- Nexus的仓库与仓库组
- 修改文章那些事