当前位置: 首页 > wzjs >正文

哈尔滨大型网站制作开发站长素材网站

哈尔滨大型网站制作开发,站长素材网站,wordpress 非插件代码高亮,东莞网站建设都找菲凡网络目录 一、消息管理器 二、获得新装备 三、UI面板创建 消息管理器除了简单的订阅(Subscribe)、取消订阅(Unsubscribe)操作以外,还需处理延迟分发(Dispatch)的情况。 (即时处理可参考:Unity | 工具类-利用事件系统进行业务串通-CSDN博客&…

目录

一、消息管理器

二、获得新装备

三、UI面板创建


        消息管理器除了简单的订阅(Subscribe)、取消订阅(Unsubscribe)操作以外,还需处理延迟分发(Dispatch)的情况。

        (即时处理可参考:Unity | 工具类-利用事件系统进行业务串通-CSDN博客)

        假设玩家在游戏中获得新装备后,系统则会发送消息通知UI面板去显示第二个页签上的红点提示,但此时UI面板尚未创建,当玩家打开UI面板时消息早就发送过了。而延迟消息可以先把消息推送到缓存中,由需要拉取延迟消息的类(UI面板)自行调用拉取函数即可。这样的设计可以应对大部分游戏对于消息管理方面的需求,包括刷怪、关卡的消息提示等。

一、消息管理器


public class MessageManager
{static MessageManager mInstance;public static MessageManager Instance{get{return mInstance ?? (mInstance = new MessageManager());}}Dictionary<string, Action<object[]>> mMessageDict = new Dictionary<string, Action<object[]>>(32);// 将缓存字典设置为存储队列,防止多次分发时覆盖,key为消息名,value为参数队列Dictionary<string, Queue<object[]>> mDispatchCacheDict = new Dictionary<string, Queue<object[]>>(16);private MessageManager() { }//订阅消息public void Subscribe(string message, Action<object[]> action){Action<object[]> value = null;//已有消息则追加绑定if (mMessageDict.TryGetValue(message, out value)){value += action;mMessageDict[message] = value;}else                                                       //没有消息则添加到字典里{mMessageDict.Add(message, action);}}//取消消息订阅public void Unsubscribe(string message){mMessageDict.Remove(message);}//允许按委托实例取消订阅public void Unsubscribe(string message, Action<object[]> action){if (mMessageDict.TryGetValue(message, out var existingAction)){existingAction -= action; // 移除特定委托if (existingAction == null){mMessageDict.Remove(message); // 无订阅者则移除消息}else{mMessageDict[message] = existingAction;}}}public void Dispatch(string message, object[] args = null, bool addToCache = false){if (addToCache){// 如果不存在则创建新队列if (!mDispatchCacheDict.TryGetValue(message, out var queue)){queue = new Queue<object[]>();mDispatchCacheDict[message] = queue;}queue.Enqueue(args); // 参数入队}else{// 触发所有订阅者if (mMessageDict.TryGetValue(message, out var action)){action.Invoke(args);}}}public void ProcessDispatchCache(string message){if (mDispatchCacheDict.TryGetValue(message, out var queue)){// 处理队列中的所有消息while (queue.Count > 0){var args = queue.Dequeue();Dispatch(message, args); // 分发时不再缓存}mDispatchCacheDict.Remove(message);}}/// <summary>/// 重置消息管理器,必须用Static方法修饰/// </summary>public static void Reset(){mInstance = null; // 下次访问时会重新初始化}
}

二、获得新装备

        获得新食物时,UI面板未初始化。

    //处理获得新食物的消息void OnGetNewFood1(){MessageManager.Instance.Dispatch("GetNewFood", new object[] { 3 }, true);}void OnGetNewFood2(){MessageManager.Instance.Dispatch("GetNewFood", new object[] { 2 }, true);}

三、UI面板创建

void OnEnable(){MessageManager.Instance.Subscribe("GetNewFood", OnGetNewFood);//处理延迟消息MessageManager.Instance.ProcessDispatchCache("GetNewFood");//避免场景切换后残留旧数据,可重置单例实例。SceneManager.sceneLoaded += (scene, mode) => MessageManager.Reset();}/// <summary>/// 移除所有订阅/// </summary>// void OnDisable()// {//     MessageManager.Instance.Unsubscribe("GetNewFood");// }/// <summary>/// 移除当前实例的订阅/// </summary>void OnDisable(){// 仅移除当前实例的委托MessageManager.Instance.Unsubscribe("GetNewFood", OnGetNewFood);}private void OnGetNewFood(object[] obj){if (obj != null && obj.Length > 0 && obj[0] is int count){Debug.Log($"获得 {count} 个新食物");}else{Debug.LogError("无效的食物数量参数!");}}

http://www.dtcms.com/wzjs/405087.html

相关文章:

  • ppt网站超链接怎么做企业seo顾问服务阿亮
  • 论坛门户网站开发企业自助建站
  • 如何承接设计网站建设英语seo什么意思
  • 数字广东网络建设有限公司电话杭州网络排名优化
  • 沈阳网站建设多少钱邵阳网站seo
  • 推荐几个没封的正能量网站产品市场营销策划方案
  • ubuntu中wordpressseo推广系统
  • 容桂营销网站建设建站公司最新报价
  • 网站邮箱接口怎么设置搜索推广公司
  • 网站的横幅怎么做吸引人的软文
  • wordpress虚拟3d网站sem代运营
  • 邢台移动网站建设报价比较正规的代运营
  • 常德做网站2022适合小学生的简短新闻
  • 网站建设中常用的技术有哪些seo超级外链发布
  • 网站建设课程设计论文百度网站推广申请
  • 网站建设与维护教学课件acca少女网课视频
  • 软件下载网站整站源码成年s8视频加密线路
  • 能用VUE做网站自己怎么做网站网页
  • 做设计最好的参考网站百度云搜索引擎入口盘多多
  • 深圳做棋牌网站建设哪家好trinseo公司
  • 济南城乡建设官方网站线下推广活动策划方案
  • 中国怎么样做跨境网站北京外包seo公司
  • 如何做赚钱的网站域名备案查询
  • 温州网站设计制作课程关键词一般是指什么
  • 旅游网站html5代码可口可乐软文范例
  • 长安网站建设网络推广优秀的营销策划案例
  • 如何做网站栏目规划英文站友情链接去哪里查
  • 外国网站上做Task泰州百度公司代理商
  • 网站建设的目的模板长尾关键词挖掘工具爱网站
  • 网站建设怎么创业seo在线论坛