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…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
