Unity中,C#的事件与委托区别和经典实例

文章目录

      • 实例1:委托(Delegate)的基本用法
      • 实例2:事件(Event)的声明与订阅
      • 实例3:Unity引擎中的委托实例 - UI Button.onClick
      • 实例4:事件(Event)的安全性
      • 实例5:事件处理器链(Multicast Delegate)

在Unity中,C#的事件处理与委托密切相关。下面通过5个实例来详细阐述它们的区别和使用场景:

实例1:委托(Delegate)的基本用法

public delegate void MyAction(string message);public class MyClass
{private MyAction _myAction;public MyClass(MyAction action){_myAction = action;}public void TriggerAction(){if (_myAction != null)_myAction("触发了一个动作!");}
}public class MainScript : MonoBehaviour
{void Start(){MyClass myClass = new MyClass(OnActionTriggered);}void OnActionTriggered(string message){Debug.Log(message);}
}

在这个例子中,MyAction 是一个自定义的委托类型,它引用了一个无返回值并接受字符串参数的方法。当 MyClass 中的 TriggerAction 方法被调用时,会执行传递给构造函数的委托方法 OnActionTriggered

实例2:事件(Event)的声明与订阅

public class EventExample : MonoBehaviour
{// 声明一个基于委托类型的事件public event Action<string> OnMessageReceived;void Update(){if (Input.GetKeyDown(KeyCode.Space)){// 触发事件OnMessageReceived?.Invoke("接收到一个消息!");}}void OnEnable(){// 订阅事件OnMessageReceived += HandleMessage;}void OnDisable(){// 取消订阅事件OnMessageReceived -= HandleMessage;}void HandleMessage(string message){Debug.Log(message);}
}

在此例中,我们定义了一个名为 OnMessageReceived 的事件,它是基于 Action<string> 委托的。通过 +=-= 运算符可以添加或移除事件的监听器(即响应事件的方法)。当按下空格键时,事件会被触发,并通知所有已订阅的监听器。

实例3:Unity引擎中的委托实例 - UI Button.onClick

public class UIExample : MonoBehaviour
{public Button myButton;void Start(){// 将方法赋值给按钮点击事件的委托myButton.onClick.AddListener(ButtonClicked);}void ButtonClicked(){Debug.Log("按钮被点击了!");}void OnDestroy(){// 清理事件监听器以防止内存泄漏myButton.onClick.RemoveAllListeners();}
}

这个实例展示了Unity引擎内置的UI组件Button中对委托的实际应用。onClick 是一个预定义的 UnityEvent,它背后也是基于委托机制实现的。这里我们为按钮点击事件添加了一个监听器方法 ButtonClicked

实例4:事件(Event)的安全性

public class SafeEventExample
{// 私有存储事件的委托实例private event EventHandler<MyEventArgs> SafeEvent;public void RaiseSafeEvent(string data){SafeEvent?.Invoke(this, new MyEventArgs(data));}public void Subscribe(EventHandler<MyEventArgs> handler){SafeEvent += handler;}public void Unsubscribe(EventHandler<MyEventArgs> handler){SafeEvent -= handler;}public class MyEventArgs : EventArgs{public readonly string Data;public MyEventArgs(string data){Data = data;}}
}

此例强调了事件相对于直接操作委托的安全性。事件通常在类内部作为一个私有字段进行封装,并提供公共的 +=-= 方法来管理订阅者。这样可以防止外部代码随意修改或触发事件。

实例5:事件处理器链(Multicast Delegate)

public class MulticastDelegateExample
{public delegate void MessageHandler(string message);public event MessageHandler OnMessage;void Awake(){OnMessage += PrintToConsole;OnMessage += SendEmail;// 触发事件,多个监听器将依次执行OnMessage("多重委托示例");}void PrintToConsole(string message){Debug.Log("打印到控制台:" + message);}void SendEmail(string message){Debug.Log("模拟发送邮件:" + message);}
}

在这个实例中,单个事件可以关联多个不同的方法,这就是多播委托的概念。当事件触发时,所有的注册方法(如 PrintToConsoleSendEmail)都会按顺序执行。这是事件功能的一个重要特性,允许单一事件触发多个相关的行为。

总结:

  • 委托是类型安全的函数指针,用于表示可重用的方法签名。
  • 事件是一种设计模式,它基于委托机制,提供了发布/订阅模型,确保了安全性(不可直接调用或修改),且支持多播(多个方法可以同时响应同一个事件)。
  • 在Unity中,事件通常用于游戏对象间的通信,例如用户输入、状态变化或其他特定游戏逻辑的通知。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

AJAX.

概念:AJAX&#xff1a;异步的 JavaScript 和 XML AJAX作用: 1.与服务器进行数据交换: 通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的是数据 使用了AJAX和服务器进行通讯&#xff0c;就可以使用HTML和AJAX来替换JSP页面了 2.异步交互:可以在不重新加载整个页面的…

(C++) 详解内存地址空间

详解内存空间 0. 概述 一个C/C 程序&#xff0c;编译之后&#xff0c;形成的程序&#xff0c;在执行期间&#xff0c;内存中不仅存在一块区域用于存放代码&#xff0c;还有一些其他的区域用于使用&#xff0c;本节会详解C/C内部所使用的内存地址空间&#xff0c;关于各内存的…

63-JQuery语法,选择器,事件,方法,遍历循环each,attr(),.prop(),JQuery操作DOM

1.一个JS库,用js封装很多的方法放到一个文件里面,直接拿了用就可以 文件名带min是压缩过的不带min是没压缩过的 2.JQuery语法 通过选取HTML元素,并对选取的元素执行某些操作 基础语法:$(selector).action() <!-- 需要把JQuery文件先引入才能用 --><script src…

IDEA 2021.3激活

1、打开idea&#xff0c;在设置中查找Settings/Preferences… -> Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io搜索&#xff1a;IDE Eval Reset 插件进行安装。应用和使用&#xff0c;如图

探秘SuperCLUE-Safety:为中文大模型打造的多轮对抗安全新框架

探秘SuperCLUE-Safety&#xff1a;为中文大模型打造的多轮对抗安全新框架 进入2023年以来&#xff0c;ChatGPT的成功带动了国内大模型的快速发展&#xff0c;从通用大模型、垂直领域大模型到Agent智能体等多领域的发展。但是生成式大模型生成内容具有一定的不可控性&#xff0c…

【数据库】达梦数据库DM8开发版安装

目录 一、达梦数据库概述 1.1 达梦数据库简介 1.2 产品特性 1.3 产品架构 二、安装前准备 2.1 新建 dmdba 用户 2.2 修改文件打开最大数 2.3 挂载镜像 2.4 新建安装目录 2.5 修改安装目录权限 三、数据库安装 3.1 命令行安装 3.2 配置环境变量 四、配置实例 4.1…

LeetCode 热题 100 | 二叉树(下)

目录 1 114. 二叉树展开为链表 2 105. 从前序与中序遍历序列构造二叉树 3 437. 路径总和 III 菜鸟做题&#xff08;即将返校版&#xff09;&#xff0c;语言是 C 1 114. 二叉树展开为链表 题眼&#xff1a;展开后的单链表应该与二叉树 先序遍历 顺序相同。 而先序遍历就…

大语言模型的深度裁剪法

在人工智能领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;已经成为推动语言理解和生成任务进步的重要力量。随着模型规模的不断扩大&#xff0c;如何优化这些模型的计算效率成为了一个迫切需要解决的问题。大型语言模型通常包含数十亿甚至数千亿的参数&#xff0c;这…

四、分类算法 - 朴素贝叶斯算法

目录 1、朴素贝叶斯算法 1.1 案例 1.2 联合概率、条件概率、相互独立 1.3 贝叶斯公式 1.4 朴素贝叶斯算法原理 1.5 应用场景 2、朴素贝叶斯算法对文本进行分类 2.1 案例 2.2 拉普拉斯平滑系数 3、API 4、案例&#xff1a;20类新闻分类 4.1 步骤分析 4.2 代码分析 …

conda下tensorflow安装

conda create -n tf21 python3.7 conda activate tf21 conda install tensorflow-gpu2.1验证 import tensorflow as tf tf.test.is_built_with_cuda()

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…

如何使用 GitHub Action 在 Android 中构建 CI-CD

如何使用 GitHub Action 在 Android 中构建 CI-CD 一、什么是 CI/CD&#xff1f;二、什么是 CI&#xff1a;持续集成&#xff1f;三、什么是CD&#xff1a;持续部署&#xff1f;3.1 持续交付3.2 持续部署 四、使用 GitHub 操作在 Android 中构建 CI-CD 管道4.1 步骤 五、什么是…

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系&#xff1f; 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

electron学习和新建窗口

首先我们要先下载electron npm install --save-dev electron 建立入口文件main.js 新建一个入口文件 main.js&#xff0c;然后导入eletron新建一个窗口。 const { app, BrowserWindow, ipcMain } require("electron"); const path require("path");func…

centos或者 ubuntu 查找当前目录所有文件包含指定值的文件地址

出现环境是我的nginx缓存 缓存了一个css 但是这个css不是最新的了 所以直接在缓存的目录下执行 find /data -type f -exec grep -l "被缓存文件的内容" {} 找到以后直接vi 查看一下 如果内容没问题的话 直接 rm -rf 删除了就可以了

Async注解详解-Async的作用以及原理

文章目录 起因Async作用原理EnableAsyncAsyncAnnotationBeanPostProcessor 起因 作为一个菜鸟&#xff0c;总是会遇到各种匪夷所思的bug。今天&#xff0c;不出意外的话今天我又遇到了意外…bug… 我在调用同事的一个方法时&#xff0c;莫名奇妙的报了空指针&#xff0c;当前…

压缩感知的图像仿真(MATLAB源代码)

压缩感知是一种用于高效获取和表示信号的技术&#xff0c;它可以显著减少数据的采样和传输量&#xff0c;同时保持对信号的高质量恢复能力。在压缩感知中&#xff0c;信号被表示为其在一个稀疏基中的稀疏线性组合。通过仅使用少量的随机投影测量&#xff0c;就能够捕捉信号的大…

报表控件Stimulsoft 新版本2024.1中,功能区工具栏新功能

今天&#xff0c;我们将讨论Stimulsoft Reports、Dashboards 和 Forms 2024.1版本中的一项重要创新 - 在一行中使用功能区工具栏的能力。 Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinF…

Elasticsearch Update By Query详解

1. 使用场景 一般在以下几种情况时&#xff0c;我们需要重建索引&#xff1a; 索引的 Mappings 发生变更&#xff1a;字段类型更改&#xff0c;分词器及字典更新 索引的 Setting 发生变更&#xff1a;索引的主分片数发生改变 集群内&#xff0c;集群间需要做数据迁移 Elastiic…

【移动安全】MobSF联动安卓模拟器配置动态分析教程

原文链接 MobSF联动安卓模拟器配置动态分析教程 实现方式 Windows开启安卓模拟器并进行相关配置作为调试客户端&#xff0c;Linux使用docker开启MobSF作为服务端。 好处&#xff1a;干净&#xff0c;部署简单&#xff0c;不用安装乱七八糟的环境&#xff0c;防止破坏其他应…