Unity中的委托和事件(UnityAction、UnityEvent)

委托和事件

🎒什么是委托,委托的关键字是Delegate,委托是一种函数的容器,运行将函数做为变量来进行传递
通过Delegate关键字我们声明了一个无参无返回的委托,通过这个委托我们可以存储无参无返回的函数

public delegate void myAction();

什么是多播委托,委托中可以存储多个函数,我们在调用这个委托时及多播委托,委托支持以下俩种用法,比较建议使用Invoke调用,这样可以明确知道这是一个委托,不容易和函数调用混淆

myAction();
myAction.Invoke();

🎒什么是事件,有了委托那么进一步对委托进行安全封装就是事件,事件在委托关键字前加上event即可,那么事件和委托有什么区别,为什么要进一步封装呢

public event delegate void myEvent();

事件不允许在类外部直接通过=赋值,也不允许在类的外部调用,这样可以避免直接暴露操作权限太大而被清空的情况,使用者只能通过一个个注册或注销来操作,保证了一种自产自销
特别的事件也不支持做为临时变量,所以我们只能声明为全局变量

C#封装

🎒在使用委托时每次都需要去声明对应的委托十分蛮烦,所以C#内部为我们封装了委托
包括了ActionFunc

// 无参无返回的委托
Action action;
Action<int,int> act; // 有参数无返回委托
Func<int,int> func; // 有参有返回的委托

那么事件只需要加上event关键字即可

// 无参无返回的委托
public event Action myEvent;

Unity封装

🎒C#已经为我们封装了那么Unity为什么又需要重新封装一个呢,委托事件设计之初并不会想到应用于Unity游戏开发所以没有形成一些方便Unity使用的编辑功能
这里我们可以先看一下UnityEvent的部分源码

namespace UnityEngine.Events
{/// <summary>///   <para>A zero argument persistent callback that can be saved with the Scene.</para>/// </summary>[Serializable]public class UnityEvent : UnityEventBase{public void AddListener(UnityAction call) => this.AddCall(UnityEvent.GetDelegate(call));public void RemoveListener(UnityAction call) => this.RemoveListener(call.Target, call.Method);public void Invoke() { ... }}

👓️首先可以看见Unity封装了一个UnityEvent类,UnityEvent使用了Serializable特性,说明他是可以序列化的,我们声明一个公共的UnityEvent可以在Inspector窗口中看到
在这里插入图片描述
UnityEvent为我们提供了三个方法对事件进行注册注销和调用,UnityEvent是一个类,当我们设置为public时Unity会自动为我们进行实例化,但是如果是private私有时,就需要手动new为UnityEvent开辟空间了

👓️我们还能看见AddListenerRemoveListener传入的是一个UnityAction,UnityAction是Unity封装定义的一个委托,这里我们需要知道函数其实就是一个委托所以我们可以正常传入函数

👓️接着我们看一下UnityAction的源码是怎么样的,与C#封装的委托不同的是UnityAction最多支持四个参数

namespace UnityEngine.Events
{/// <summary>///   <para>Zero argument delegate used by UnityEvents.</para>/// </summary>public delegate void UnityAction();
}
namespace UnityEngine.Events
{public delegate void UnityAction<T0>(T0 arg0);public delegate void UnityAction<T0, T1>(T0 arg0, T1 arg1);public delegate void UnityAction<T0, T1, T2>(T0 arg0, T1 arg1, T2 arg2);public delegate void UnityAction<T0, T1, T2, T3>(T0 arg0, T1 arg1, T2 arg2, T3 arg3);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR

本文来自天工AI --------- 命令用于安装CMake的脚本&#xff0c;其中--skip-license参数表示跳过许可协议的显示&#xff0c;--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量&#xff0c;应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…

面试真题 | 金山 C++ [20241218]

文章目录 @[toc]1.c++程序的内存分布C++程序的内存分布面试官的追问及回答2.堆和栈的区别堆和栈的区别1. 管理方式2. 内存分配和释放3. 内存大小和生命周期4. 访问权限面试官的追问及回答3.内存泄漏怎么办内存泄漏的处理方法面试官的追问及回答4.智能指针,哪几种智能指针及其种…

呼入机器人:24小时客户服务的未来趋势

呼入机器人&#xff1a;24小时客户服务的未来趋势 作者&#xff1a;开源大模型智能呼叫中心系统FreeAICC&#xff0c;Github&#xff1a;https://github.com/FreeIPCC/FreeAICC 在当今快节奏的商业环境中&#xff0c;客户服务已成为企业竞争的核心要素之一。随着人工智能技术…

使用计算机创建一个虚拟世界

创建一个虚拟世界是一项复杂而多方面的工作&#xff0c;它涉及多个领域的知识&#xff0c;包括计算机图形学、编程、物理模拟、声音设计、艺术设计等。以下是创建虚拟世界的基本步骤和工具建议&#xff1a; 1. 确定虚拟世界的目标和范围 目标&#xff1a;明确这个虚拟世界的用…

uniapp v-tabs修改了几项功能,根据自己需求自己改

根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长&#xff0c;导致滑动异常2.change 事件拿不到当前点击的数据&#xff0c;通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长&#xff0c;导致滑动异常…

CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现

效果如下&#xff1a; &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载此dll插件&#xff0c;然后输入“zbbz”运行&#xff0c;选择文件夹即可。支持字体大小变化&#xff0c;输入“zbbd”可设置坐标字体变大或缩小的倍数&#xff09; 部分代码如下&#xff1a;…

vue项目中使用ag-grid

我这个项目中使用原因&#xff1a; 支持大数据量数据&#xff0c;滑动页面不会有白屏现象可对当前列表中数据进行过滤 安装依赖 ag-grid-vueag-grid-community 我这里使用的社区版ag-grid-community/locale 中文配置依赖 main.js import "ag-grid-community/styles/ag-gr…

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson&#xff0c;引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串&#xff0c;效果如下&#xff1a; json字符串 {"1": &q…

Redis 7.x如何安装与配置?保姆级教程

大家好&#xff0c;我是袁庭新。最新写了一套最新版的Redis 7.x企业级开发教程&#xff0c;今天先给大家介绍下Redis 7.x如何在Linux系统上安装和配置。 1 Redis下载与安装 使用非关系型数据库Redis必须先进行安装配置并开启Redis服务&#xff0c;然后使用对应客户端连接使用…

Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)

1、概述 在使用Redis作为MySQL的缓存层时&#xff0c;缓存一致性问题是指Redis中的缓存数据与MySQL数据库中的实际数据不一致的情况。这可能会导致读取到过期或错误的数据&#xff0c;从而影响系统的正确性和用户体验。 为了减轻数据库的压力&#xff0c;通常读操作都是先读缓…

代码加入SFTP JAVA ---(小白篇3)

在 Java 中&#xff0c;您可以使用 JSch&#xff08;Java Secure Channel&#xff09;库 来连接和操作 SFTP 服务器。以下是一个完整的示例代码&#xff0c;展示如何使用 Java 接入 SFTP 服务器并上传文件。 1.服务器上加入SFTP------(小白篇 1) 2.加入SFTP 用户------(小白篇…

leetcode之hot100---240搜索二维矩阵II(C++)

思路一&#xff1a;通过遍历主对角线上元素判断查找方向 主对角线遍历&#xff1a; 遍历主对角线上的每个元素&#xff08;matrix[i][i]&#xff09;&#xff0c;其中 i 的范围是 [0, min(m, n) - 1]。如果目标值小于当前主对角线元素&#xff0c;说明目标值可能在当前元素的左…

【Nginx-4】Nginx负载均衡策略详解

在现代Web应用中&#xff0c;随着用户访问量的增加&#xff0c;单台服务器往往难以承受巨大的流量压力。为了解决这一问题&#xff0c;负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;提供了多种负载均衡策略&#xff0c;能够有效地将请求分…

git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息

git remote -v 是一个 Git 命令&#xff0c;用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时&#xff0c;你会看到类似以下的输出&#xff1a; origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…

《Java 与 Deeplearning4j:开启深度学习高效训练之旅》

在当今科技飞速发展的时代&#xff0c;深度学习无疑是人工智能领域的一颗璀璨明珠。Java 作为一种广泛应用的编程语言&#xff0c;与 Deeplearning4j 框架的结合&#xff0c;为开发者们开辟了一条在深度学习领域大展身手的新路径。那么&#xff0c;如何在 Java 中高效地使用 De…

MySQL 基础:开启数据库之旅

MySQL 基础&#xff1a;开启数据库之旅 在当今数字化的时代&#xff0c;数据扮演着至关重要的角色&#xff0c;而数据库管理系统则是存储、管理和操作这些数据的强大工具。MySQL 作为一款广受欢迎的开源关系型数据库管理系统&#xff0c;被广泛应用于各类网站、应用程序以及企业…

递归读取指定目录下的文件

序言 需要读取sftp服务器上符合指定的文件名正则的文件列表&#xff0c;目前想到的最好的办法就是递归。 我这里引入的依赖是&#xff1a; <!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artif…

<代码随想录> 算法训练营-2024.12.21

今日专题 &#xff1a;动态规划、打家劫舍 总结&#xff1a; 198. 打家劫舍 class Solution:def rob(self, nums: List[int]) -> int:#dp[n]max(dp[n-1],dp[n-2]nums[n])sizelen(nums)if size1:return nums[0]#n的状态只依赖n-1和n-2的状态&#xff0c;对状态进行压缩i,j…

uniapp 将base64字符串保存为图片、Word、Excel、音频、视频等文件

function blobToBase64(blob) {return new Promise((resolve, reject) > {const reader new FileReader();reader.onerror reject;reader.onload () > {if (typeof reader.result string) {// 去掉"data:..."前缀&#xff0c;只保留 Base64 部分resolve(re…

[计算机网络]唐僧的”通关文牒“NAT地址转换

1.NAT&#xff1a;唐僧的通关文牒 在古老的西游记中&#xff0c;唐僧师徒四人历经九九八十一难&#xff0c;终于取得了真经。然而&#xff0c;他们并不是一开始就获得了通关文牒&#xff0c;而是经过了重重考验&#xff0c;最终得到了国王的认可&#xff0c;才顺利通过了各个关…