上代码

/********************************************************文件: EasyMsg.cs作者: 阿飞日期: 2022年02月15日_09:24寄语: 虎年 虎虎生威  大吉大利功能: *********************************************************/using System;
using System.Collections.Generic;
using UnityEngine;public enum EasyKeys
{None,//默认空事件//请自定义事件名称测试1,测试2,
}
/// <summary>
/// 简易高效枚举消息机制
/// 可以限制消息的调用次数
///同一事件可加入多个方法
///
/// 使用简单粗暴
///
/// 要使用请先调用 AddEvent
/// 注销消息调用  RemoveEvent
/// </summary>
public class EasyMsg
{static Dictionary<UnityEngine.Object, Dictionary<string, Action<object>>> mRegisteredObjects = new Dictionary<UnityEngine.Object, Dictionary<string, Action<object>>>();static Dictionary<string, Action<object>> limitCountEventList = new Dictionary<string, Action<object>> ();static Dictionary<string, int> limitCountList = new Dictionary<string, int> ();/// <summary>/// 注册事件/// 一般 awake 中注册/// </summary>/// <param name="obj"></param>/// <param name="eventkey">事件名称 ,提前在 Easykey中 写入枚举</param>/// <param name="onMsgReceived"> 使用lambo表达式  (data)=>{function(data);}</param>public static void AddEvent(UnityEngine.Object obj, EasyKeys eventkey, Action<object> onMsgReceived,int limitCount=-1){string msgName = eventkey.ToString();if (!mRegisteredObjects.ContainsKey(obj)){Dictionary<string, Action<object>> dict = new Dictionary<string, Action<object>>();dict.Add(msgName, _ => { });dict[msgName] += onMsgReceived;mRegisteredObjects.Add(obj, dict);}else{if (mRegisteredObjects[obj].ContainsKey(msgName)){mRegisteredObjects[obj][msgName] += onMsgReceived;}else{mRegisteredObjects[obj].Add(msgName, _ => { });mRegisteredObjects[obj][msgName] += onMsgReceived;}}//注册限制次数的事件if (limitCount !=-1){limitCountEventList.Add(msgName, onMsgReceived);limitCountList .Add (msgName,limitCount );}}/// <summary>/// 移除事件/// 销毁物体时必须调用此方法,如果物体上有注册消息的话/// </summary>/// <param name="obj">在mono中一般用this.gameobject</param>/// <param name="eventkey">事件名称</param>/// <param name="onMsgReceived">事件中的某个方法</param>public static void RemoveEvent(UnityEngine.Object obj, EasyKeys eventkey = EasyKeys.None, Action<object> onMsgReceived = null){if (onMsgReceived != null){if (mRegisteredObjects.ContainsKey(obj)){if (mRegisteredObjects[obj].ContainsKey(eventkey.ToString())){                   mRegisteredObjects[obj][eventkey.ToString()] -= onMsgReceived;}elseDebug.Log("移除事件失败,未找到 " + eventkey);}elseDebug.Log("移除事件失败,未找到 " + eventkey);}else if (eventkey != EasyKeys.None){if (mRegisteredObjects.ContainsKey(obj)){if (mRegisteredObjects[obj].ContainsKey(eventkey.ToString())){mRegisteredObjects[obj].Remove (eventkey.ToString());}elseDebug.Log("移除事件失败,未找到 " + eventkey);}elseDebug.Log("移除事件失败,未找到 " + eventkey);}else{if (mRegisteredObjects.ContainsKey(obj)){mRegisteredObjects[obj].Remove(eventkey.ToString());}elseDebug.Log("移除事件失败,未找到 " + eventkey);}if (limitCountList .ContainsKey (eventkey.ToString ())){limitCountEventList.Remove(eventkey .ToString());limitCountList.Remove(eventkey.ToString());}}/// <summary>/// 执行事件/// </summary>/// <param name="eventkey"></param>/// <param name="data"></param>public static void Execute(EasyKeys eventkey, object data=null ){        string msgName = eventkey.ToString();foreach (var item in mRegisteredObjects){foreach(var obj in item.Value){               if (obj.Key == msgName){if (obj.Value !=null ){obj.Value(data);}                                    }               }               }//检测事件是否限制次数if (limitCountList.ContainsKey(msgName)){limitCountList[msgName]--;if (limitCountList[msgName] <= 0){//注销事件                          Action<object> cb = limitCountEventList[msgName];UnityEngine.Object obj=null;foreach (var msg in mRegisteredObjects){foreach (var dic in msg.Value){if (dic.Key == msgName){obj = msg.Key;                           }}}if (obj !=null ){RemoveEvent(obj, eventkey, cb);limitCountEventList.Remove(msgName);limitCountList.Remove(msgName);if (mRegisteredObjects[obj][msgName] ==null ){RemoveEvent(obj, eventkey);}}else{Debug.LogError("注销事件失败");}}}}}

Unity中简单粗暴的消息机制(可限制消息调用次数)相关推荐

  1. unity中简单的血条自作

    unity中制作血条有很多方法,多数用NGUI:这里我就说说一个简单的血条制作方法吧: 这个血条制作不像NGUI一样,它是靠一段代码就可以实现的,但看起来比较效果比较差,还是看代码吧: public ...

  2. 在Unity中简单地制作一张2D地图并随机生成资源

    这个作业属于哪个课程 软件工程2022年春-F班 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 课程回顾.个人技术总结 其他参考文献 <构建之法> 目录 一. ...

  3. 【unity游戏开发教程】Unity+Umotion Pro+VRoid+Blender制作人物模型和动画,在unity中简单制作二次元人物动画

    前言 大家好!本期教程教大家在unity中制作二次元人物模型和动画 文章目录 前言 0.环境准备 1.下载VRoid Studio 2.Umotion Pro下载 3.Mixamo网站 4.blend ...

  4. odoo14 mail.thread邮件消息机制(发送消息、字段变化跟踪记录)mail.activity.mixin安排活动

    odoo内部的消息机制是十分便捷的,可以使用odoo 系统消息进行沟通,也可以通过odoo代发邮件进行沟通. 通过点击系统右上角的用户名,在弹出的下拉框中选择 '首选项' ,我们可以设置email选项 ...

  5. Unity中简单冲刺技能,加技能图标倒计时UI制作

    首先,在Canvas下创建一个image1,改名 然后把image1的source image换成技能图片,或者随便一张图片都行 接着,在image1下创建子类image2 接着,按照下面图片调整 s ...

  6. Unity中简单的matcap+fresnel shader的实现

    Shader "Unlit/matcap"{//matcapProperties{_NormalMap("法线贴图", 2D) = "bump&quo ...

  7. Unity中简单的cubecap+fresnel shader的实现

    Shader "Unlit/cubecap" {//cubecapProperties{_NormalMap("法线贴图", 2D) = "bump& ...

  8. EJB与JAVA BEAN_J2EE的异步消息机制

    EJB与JAVA BEAN_J2EE的异步消息机制 EJB与JAVA BEAN的区别 Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个 ...

  9. Android:Handler的消息机制

    前言 Android 的消息机制原理是Android进阶必学知识点之一,在Android面试也是常问问题之一.在Android中,子线程是不能直接操作View,需要切换到主线程进行.那么这个切换动作就 ...

最新文章

  1. Hadoop应用实战100讲(一)-Hadoop进行文件压缩
  2. Lua 协同程序(coroutine)
  3. 高级数据结构与算法 | 回溯算法(Back Tracking Method)
  4. 面试官:请实现一个通用函数把 callback 转成 promise
  5. vue 中 created 和 mounted 钩子生命周期 问题
  6. Computer Hardware
  7. ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  8. 求ReportMachine的OCX教程
  9. 全网最全的划分VLAN的方法,走过路过不要错过
  10. android电视 怎么调电视机的信号源,如何设置智能电视、盒子信号源?原来这么简单!具体方法如下...
  11. 编写程序实现通过有道或百度翻译url对用户输入数据进行翻译_8亿用户AI有道,超强神经网络翻译技术大解密...
  12. CentOS7 Linux引导修复
  13. CAE(Convolutional Auto-Encode) 卷积自编码
  14. SqlServer计算2个时间的间隔时间(工作日时间),不包括法定节假日和周末
  15. SEO(搜索引擎优化)是不是任何行业、产品都适合做SEO?
  16. 磁场强度切向分量连续性证明
  17. EasyCVR对接华为IVS订阅摄像机和用户变更请求接口介绍
  18. 克里金插值(python)
  19. python中if函数的使用方法_Python-15 (if的基础使用)
  20. Photoshop制作简洁清新的插画海报图片

热门文章

  1. mysql的默认密码_mysql默认密码是多少
  2. 网络IO模型的介绍引出nginx的网络IO模型
  3. 浅析Redis分布式锁——从自己实现到Redisson的实现
  4. 三星s8升级到android9相机,三星S8升级ONE UI体验 三年三星粉终于吃上派
  5. GRR(评价重复性和再现性)
  6. SD-WAN智慧消防解决方案
  7. 如何使用记事本将文字转换成语音?这个简单的方法你知道吗
  8. Python中将字节流文件转换成图片文件
  9. Nginx 和 GeoIP 模块的使用
  10. 如何用python画函数图像_使用python的pyplot绘制函数实例