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.rhkb.cn/news/259182.html

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

相关文章

C#安装CommunityToolkit.Mvvm依赖

这里需要有一定C#基础&#xff0c; 首先找到右边的解决方案&#xff0c;右键依赖项 然后选择nuget管理 这里给大家扩展一下nuget的国内源&#xff08;https://nuget.cdn.azure.cn/v3/index.json&#xff09; 然后搜自己想要的依赖性&#xff0c;比如CommunityToolkit.Mvvm 再点…

面试经典150题【1-10】

文章目录 面试经典150题【1-10】88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组中的重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机1122. 买卖股票的最佳时机 II55.跳跃游戏![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff…

【智能家居入门4】(FreeRTOS、MQTT服务器、MQTT协议、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…

Midjourney风格一致功能解读及使用方法

Midjourneys再次迎来更新&#xff0c;本次新增“风格一致”功能&#xff01;用户期待已久的风格模仿功能终于实现了&#xff01; --sref 虽然目前只是测试功能&#xff0c;但已经相当强大了&#xff0c;这篇文章我将带大家先睹为快&#xff01; 别忘了&#xff0c;这个功能目前…

带你了解软件系统架构的演变

随着信息技术的飞速发展&#xff0c;软件系统架构作为支撑软件系统的核心框架&#xff0c;也在不断地演变和进步。本文旨在带你了解软件系统架构的发展历程&#xff0c;从而更好地理解现代软件系统的构建和设计。 一、单体应用架构 单体应用架构是最早的软件系统架构形式&…

这才是大学生该做的副业,别再痴迷于游戏了!

感谢大家一直以来的支持和关注&#xff0c;尤其是在我的上一个公众号被关闭后&#xff0c;仍然选择跟随我的老粉丝们&#xff0c;你们的支持是我继续前行的动力。为了回馈大家长期以来的陪伴&#xff0c;我决定分享一些实用的干货&#xff0c;这些都是我亲身实践并且取得成功的…

上位机图像处理和嵌入式模块部署(上位机主要功能)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前关于机器视觉方面&#xff0c;相关的软件很多。比如说商业化的halcon、vision pro、vision master&#xff0c;当然也可以用opencv、pytorch自…

安装配置NMon

NMon&#xff08;Nigel’s Monitor&#xff09;是一款由IBM公司提供的免费性能监控工具&#xff0c;专门用于监控AIX系统和Linux系统的资源使用情况 下载软件 wget http://sourceforge.net/projects/nmon/files/nmon16p_binaries.tar.gz 如果报错的话&#xff0c;安装提示添加…

Java实现新能源电池回收系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

线程池工作过程

线程池工作流程 线程池的处理流程总结 线程池的处理流程 当提交一个新任务到线程池时&#xff0c;线程池的处理流程如下&#xff1a; 1、线程池判断核心线程池里的线程是否都在执行任务。如果不是&#xff0c;则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执…

1Panel使用GMSSL+Openresty实现国密/RSA单向自适应

本文 首发于 Anyeの小站&#xff0c;转载请取得作者同意。 前言 国密算法是国家商用密码算法的简称。自2012年以来&#xff0c;国家密码管理局以《中华人民共和国密码行业标准》的方式&#xff0c;陆续公布了SM2/SM3/SM4等密码算法标准及其应用规范。其中“SM”代表“商密”&a…

人工智能学习与实训笔记(二):神经网络之图像分类问题

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 目录 二、图像分类问题 2.1 尝试使用全连接神经网络 2.2 引入卷积神经网络 2.3 分类函数Softmax 2.4 交叉熵损失函数 2.5 学习率优化算法 2.6 图像预处理算法 2.6.1 随机改变亮暗、对比度和颜色等 …

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器&#xff0c;你可以按照以下 步骤进行操作&#xff1a; 1. 访问 MinIO 的官方网站&#xff1a;https://min.io/&#xff0c;然后 点击页面上的”Download”按钮。 2. 在下载页面上&#xff0c;选择适合你操作系统的 …

论文阅读-EMS: History-Driven Mutation for Coverage-based Fuzzing(2022)模糊测试

一、背景 本文研究了基于覆盖率的模糊测试中的历史驱动变异技术。之前的研究主要采用自适应变异策略或集成约束求解技术来探索触发独特路径和崩溃的测试用例&#xff0c;但它们缺乏对模糊测试历史的细粒度重用&#xff0c;即它们在不同的模糊测试试验之间很大程度上未能正确利用…

Vue2学习第二天

Vue2 学习第二天 1. 数据绑定 Vue 中有 2 种数据绑定的方式&#xff1a; 单向绑定(v-bind)&#xff1a;数据只能从 data 流向页面。双向绑定(v-model)&#xff1a;数据不仅能从 data 流向页面&#xff0c;还可以从页面流向 data。 备注&#xff1a; 双向绑定一般都应用在表单…

javaweb学习day03(JS+DOM)

一、javascript入门 1 官方文档 地址: https://www.w3school.com.cn/js/index.asp离线文档: W3School 离线手册(2017.03.11 版).chm 2 基本说明 JavaScript 能改变 HTML 内容&#xff0c;能改变 HTML 属性&#xff0c;能改变 HTML 样式 (CSS)&#xff0c;能完成 页面的数据…

基于Java SSM框架实现疫情防控系统项目【项目源码】

基于java的SSM框架实现疫情防控系统演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言&#xff0c;只要能快速融入web站点就可以&#x…

2024春日营销三大内容趋势,种草爆文轻松get丨小红书数据分析

春季是市场迎来消费焕活的新周期&#xff0c;也是新一年品牌实现生意高速起步的必争节点。一年之“计”在于春&#xff0c;春日营销&#xff0c;吹响品牌营销第一声号角。那么&#xff0c;春日营销在小红书上有何内容趋势&#xff0c;跟着小编的脚步一起来看看~ 内容趋势 1、亲…

34461A 数字万用表,六位半,Truevolt DMM

01 34461A 数字万用表&#xff0c;六位半 产品综述&#xff1a; 34461A 六位半万用表是替代 Keysight 34401A 数字万用表&#xff08;此前为 Agilent 34401A&#xff09;的新一代产品。 34461A 拥有 Truevolt 系列数字万用表的全新图形显示界面、先进的分析模式和内置数学函…

JAVA JDK1.8下载安装

1、官网下载地址Java Downloads | Oracle 2、双击运行该文件 3、 4、 5、 6、安装完成后&#xff0c;现在来设置 环境变量 7、新建系统变量 8、修改Path变量 9、配置完成安装完成