unity事件处理
方法调用
//发送事件 【发送事件码,发送消息内容】
EventCenterUtil.Broadcast(EventCenterUtil.EventType.Joystick, ui);//监听无参事件
EventCenterUtil.AddListener(EventCenterUtil.EventType.Joystick, show);
public void show(){}//发送事件 有参事件
EventCenterUtil.Broadcast(EventCenterUtil.EventType.Joystick, ui, "你好");EventCenterUtil.AddListener<int>(EventCenterUtil.EventType.Joystick, show);public void show(string i){ }
unity工具类
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Unity.VisualScripting.FlowStateWidget;
public class EventCenterUtil
{public enum EventType{Joystick}public delegate void CallBack();public delegate void CallBack<T>(T arg);public delegate void CallBack<T,X>(T arg1, X arg2);private static Dictionary<EventType, Delegate> m_EventTable = new Dictionary<EventType, Delegate>();/*** 添加监听* **/public static void AddListener(EventType eventType, CallBack callBack){if (!m_EventTable.ContainsKey(eventType)){m_EventTable.Add(eventType, null);}Delegate d = m_EventTable[eventType];if (d != null && d.GetType() != callBack.GetType()){throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1}," +"要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));}m_EventTable[eventType] = (CallBack)m_EventTable[eventType] + callBack;}public static void AddListener<T>(EventType eventType, CallBack<T> callBack){if (!m_EventTable.ContainsKey(eventType)){m_EventTable.Add(eventType, null);}Delegate d = m_EventTable[eventType];if (d != null && d.GetType() != callBack.GetType()){throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1}," +"要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));}m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] + callBack;}public static void AddListener<T,X>(EventType eventType, CallBack<T, X> callBack){if (!m_EventTable.ContainsKey(eventType)){m_EventTable.Add(eventType, null);}Delegate d = m_EventTable[eventType];if (d != null && d.GetType() != callBack.GetType()){throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1}," +"要添加的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));}m_EventTable[eventType] = (CallBack<T, X>)m_EventTable[eventType] + callBack;}/*** 移除监听* **/public static void RemoveListener(EventType eventType, CallBack callBack){if (m_EventTable.ContainsKey(eventType)){Delegate d = m_EventTable[eventType];if (d == null){throw new Exception(string.Format("移除监听错误: 事件(0}没有对应的委托", eventType));}else if (d.GetType() != callBack.GetType()){throw new Exception(string.Format("移除监听错误: 尝试为事件{0}移除不同类型的委托,当前委托类型为{1},要移除的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));}}else{throw new Exception(string.Format("移除监听错误: 没有事件码{0}", eventType));}m_EventTable[eventType] = (CallBack)m_EventTable[eventType] - callBack;}public static void RemoveListener<T,X>(EventType eventType, CallBack<T, X> callBack){if (m_EventTable.ContainsKey(eventType)){Delegate d = m_EventTable[eventType];if (d == null){throw new Exception(string.Format("移除监听错误: 事件(0}没有对应的委托", eventType));}else if (d.GetType() != callBack.GetType()){throw new Exception(string.Format("移除监听错误: 尝试为事件{0}移除不同类型的委托,当前委托类型为{1},要移除的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));}}else{throw new Exception(string.Format("移除监听错误: 没有事件码{0}", eventType));}m_EventTable[eventType] = (CallBack<T,X>)m_EventTable[eventType] - callBack;}public static void RemoveListener<T, X>(EventType eventType, CallBack<T> callBack){if (m_EventTable.ContainsKey(eventType)){Delegate d = m_EventTable[eventType];if (d == null){throw new Exception(string.Format("移除监听错误: 事件(0}没有对应的委托", eventType));}else if (d.GetType() != callBack.GetType()){throw new Exception(string.Format("移除监听错误: 尝试为事件{0}移除不同类型的委托,当前委托类型为{1},要移除的委托类型为{2}", eventType, d.GetType(), callBack.GetType()));}}else{throw new Exception(string.Format("移除监听错误: 没有事件码{0}", eventType));}m_EventTable[eventType] = (CallBack<T>)m_EventTable[eventType] - callBack;}/*** 广播监听* **/public static void Broadcast(EventType eventType){Delegate d;if (m_EventTable.TryGetValue(eventType, out d)){CallBack callBack = d as CallBack;if (callBack != null){callBack();}else{throw new Exception(string.Format("广播事件错误: 事件{0}对应委托具有不同的类型", eventType));}}}public static void Broadcast<T>(EventType eventType, T arg){Delegate d;if (m_EventTable.TryGetValue(eventType, out d)){CallBack<T> callBack = d as CallBack<T>;if (callBack != null){callBack(arg);}else{throw new Exception(string.Format("广播事件错误: 事件{0}对应委托具有不同的类型", eventType));}}}public static void Broadcast<T,X>(EventType eventType, T arg1, X arg2){Delegate d;if (m_EventTable.TryGetValue(eventType, out d)){CallBack<T,X> callBack = d as CallBack<T,X>;if (callBack != null){callBack(arg1, arg2);}else{throw new Exception(string.Format("广播事件错误: 事件{0}对应委托具有不同的类型", eventType));}}}
}
相关文章:
unity事件处理
方法调用 //发送事件 【发送事件码,发送消息内容】 EventCenterUtil.Broadcast(EventCenterUtil.EventType.Joystick, ui);//监听无参事件 EventCenterUtil.AddListener(EventCenterUtil.EventType.Joystick, show); public void show(){}//发送事件 有参事件 Eve…...
《ChatGPT原理最佳解释,从根上理解ChatGPT》
【热点】 2022年11月30日,OpenAI发布ChatGPT(全名:Chat Generative Pre-trained Transformer), 即聊天机器人程序 ,开启AIGC的研究热潮。 ChatGPT是人工智能技术驱动的自然语言处理工具,它能够…...
大数据Flink(五十):流式计算简介
文章目录 流式计算简介 一、数据的时效性 二、流式计算和批量计算...
13-4_Qt 5.9 C++开发指南_基于QWaitCondition 的线程同步_Wait
在多线程的程序中,多个线程之间的同步实际上就是它们之间的协调问题。例如上一小节讲到的3个线程的例子中,假设 threadDAQ 写满一个缓冲区之后,threadShow 和 threadSaveFile 才能对缓冲区进行读操作。前面采用的互斥量和基于 OReadWriteLock…...
STM32(HAL)多串口进行重定向(printf函数发送数据)
目录 1、简介 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 4、效果测试 1、简介 在HAL库中,常用的printf函数是无法使用的。本文通过重映射实现在HAL库多个串口可进行类似printf函数的操作。 2.1 基础配置 2.…...
29_互联网(The Internet)(IP数据包;UDP;TCP;DNS;OSI)
上篇介绍了计算机网络的基础知识,也提到互联网(The Internet),本篇将会详细介绍互联网(The Internet)。 文章目录 1. 互联网(The Internet)组成及数据包传输过程2. IP 数据包的不足3…...
xShell常用命令
xShell常用命令 一、文件夹目录1、cd-更改目录2、mkdir-建立目录3、rm-删除目录4、pwd-查看当前路径5、rmdir-删除空目录 二、文件操作1、cat-显示文件内容2、diff-比较文件内容3、查看文件的名字和后缀4、ls-列出文件5、cp-复制文件6、mv-移动和重命名文件找不同:选…...
React性能优化之Memo、useMemo
文章目录 React.memo两种方式参数应用场景 拓展useMemouseMemo(calculateValue, dependencies) 参考资料 React.memo React 的渲染机制,组件内部的 state 或者 props 一旦发生修改,整个组件树都会被重新渲染一次,即时子组件的参数没有被修改&…...
IDEA开启并配置services窗口
前言: 一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时,如果要调试测需要依次启动各个项目比较麻烦。 方法一: 默认第一次打开项目的时候,idea会提示是否增加这个选项卡,如果你没…...
vue2企业级项目(三)
vue2企业级项目(三) 引入mockjs,i18n 1、mockjs 项目下载依赖 npm install --save-dev mock根目录创建mock文件夹,并创建mock/index.js import Mock from "mockjs";// 设置全局延时 没有延时的话有时候会检测不到数据…...
QT 在label上透明绘图
一、新建TransparentDemo工程 二、在界面上添加label,修改样式表,将底色置为红色,作为北京 三、新建一个TransparentLabel类,继承自QLabel 此时,工程包括文件 五、在transparentlabel.h中添加 头文件 #include …...
SAM(Segment Anything)大模型论文汇总
A Comprehensive Survey on Segment Anything Model for Vision and Beyond 论文:https://arxiv.org/abs/2305.08196 25页综述,198篇参考文献!52个开源项目!本文第一个全面回顾了分割一切模型(SAM)的研究和应用进展,…...
金融翻译难吗,如何做好金融翻译?
我们知道,金融翻译涉及企业经济这块的,是影响各公司发展很重要的一方面,翻译做得好,可以促进公司内外的交流,及时掌握各种信息,做好应对。那么,金融翻译难吗,如何做好金融翻译&#…...
Java面试题(Tomcat与Nginx)
Tomcat 什么是Tomcat? 简单来说是一个运行Java的网络服务器,也是jsp和serlvet的一个容器 Tomcat的缺省端口是多少,怎么修改? conf文件夹下修改server.xml文件 <Connector connectionTimeout"20000" port"8080" p…...
React-使用mobx
React 中使用 mobx 配置开发环境 安装mobx和中间件工具 mobx-react-lite 只能函数组件中使用 yarn add mobx mobx-react-lite初始化 mobx 定义数据状态 state在构造器中实现数据响应式处理 makeAutoObservble定义修改数据的函数 action实例化 store 并导出 import { compute…...
LeetCode ACM模式——哈希表篇(一)
刷题顺序及部分思路来源于代码随想录,网站地址:https://programmercarl.com 部分思路来源于力扣官方题解,作者主页:https://leetcode.cn/u/leetcode-solution/ 242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个…...
WPF实战学习笔记31-登录界面全局通知
UI添加消息聚合器 <md:Snackbarx:Name"LoginSnakeBar"Grid.ColumnSpan"2"Panel.ZIndex"1"MessageQueue"{md:MessageQueue}" />注册提示消息 文件:Mytodo.Views.LoginView.cs构造函数添加内容 //注册提示消息 aggre…...
通用商城项目(中)
金山编译器出问题了。下面段落标号全出问题了,排版也出问题了。懒得改了。 使用对象存储OSS,保存品牌logo 新建Module,提供上传、显示服务 有些不明所以的,按照steinliving-commodity配置了一通pom.xml 新建application.yml&…...
谨慎使用JSON.stringify
谨慎使用JSON.stringify 为了避免因为对象是引用类型而造成的数据源污染,我们通常使用 JSON.stringify 将其转换为字符串,而后通过JSON.parse方法将字符串转化一个新对象来实现深拷贝。但是在这个过程中也会存在一些问题,本文就介绍一下使用…...
驱动开发day8
编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制LED亮灭 2.按键1 按下,led1电位反转 按键2按下,led2电位反转 按键3 按下,led3电位反转 驱动程序 #include <linux/init.h> #i…...
保姆级教程:用OpenAI Whisper给视频自动生成字幕(附Python代码)
视频创作者必备:用Whisper打造高效字幕工作流 每次剪辑视频最头疼的就是加字幕?作为过来人,我完全理解那种对着时间轴逐帧调整的痛苦。直到发现Whisper这个神器,我的工作效率直接翻了三倍。今天就把这套全自动字幕生成方案完整分享…...
LFM2.5-1.2B-Thinking-GGUF部署教程:适配A10/A100/L4等主流GPU显存优化方案
LFM2.5-1.2B-Thinking-GGUF部署教程:适配A10/A100/L4等主流GPU显存优化方案 1. 模型简介与核心优势 LFM2.5-1.2B-Thinking-GGUF 是 Liquid AI 推出的轻量级文本生成模型,专为低资源环境优化设计。该模型采用 GGUF 格式存储,配合高效的 llam…...
突破语言壁垒:Unity游戏翻译破局工具如何重构跨文化体验
突破语言壁垒:Unity游戏翻译破局工具如何重构跨文化体验 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你满怀期待地启动一款国际热门Unity游戏,却被满屏陌生文字阻挡了探索脚步…...
突破B站缓存限制:m4s-converter视频格式转换完全指南
突破B站缓存限制:m4s-converter视频格式转换完全指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当旅行途中想离线观看缓存视频却…...
ViT在语义分割中的性能优化:从VOC2012数据集看如何提升自行车识别准确率
ViT在语义分割中的性能优化:从VOC2012数据集看如何提升自行车识别准确率 语义分割作为计算机视觉领域的核心任务之一,其目标是为图像中的每个像素分配类别标签。近年来,Vision Transformer(ViT)凭借其强大的全局建模能…...
LaTeX-PPT:重新定义PowerPoint公式编辑体验
LaTeX-PPT:重新定义PowerPoint公式编辑体验 【免费下载链接】latex-ppt Use LaTeX in PowerPoint 项目地址: https://gitcode.com/gh_mirrors/la/latex-ppt 一、学术演示的隐形效率杀手 周三下午的组会演示前,李教授盯着屏幕上歪歪扭扭的公式叹气…...
软文SEO的常见指标有哪些_如何撰写有吸引力的软文标题
<h2>软文SEO的常见指标有哪些</h2> <p>在当今的数字营销领域,软文(Soft Article)已经成为推动网站流量和品牌知名度的重要工具。要让软文真正发挥作用,我们必须了解软文SEO的常见指标,这些指标可以帮…...
3步诊断与优化:使用NVIDIA Profile Inspector解决显卡性能瓶颈
3步诊断与优化:使用NVIDIA Profile Inspector解决显卡性能瓶颈 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector作为一款专业的显卡驱动级配置工具,能够…...
阿里千问,有个海外版
阿里千问,有个海外版。我也是最近才知道,用了一下,发现审核尺度明显要宽松很多,国内的千问明显被约束很多,就是个半残品。据说啊,国际版千问的部分数据放在了新加坡,对标的是ChatGPT。好像现在阿…...
告别复杂配置:Ostrakon-VL-8B零售多模态模型一键部署实战
告别复杂配置:Ostrakon-VL-8B零售多模态模型一键部署实战 1. 为什么选择Ostrakon-VL-8B? 零售行业每天需要处理大量商品图片、货架陈列和顾客反馈,传统的人工分析方式效率低下且成本高昂。Ostrakon-VL-8B作为专为零售场景优化的多模态大模型…...
