首页 > 编程语言 >C#基础:委托与事件(在Unity中举例)

C#基础:委托与事件(在Unity中举例)

时间:2024-05-23 23:30:46浏览次数:16  
标签:订阅 委托 C# void Unity 举例 事件 public

委托(Delegate):

委托是C#中的一种类型,表示对具有特定参数列表和返回类型的方法的引用。委托类似于C++中的函数指针,但它是类型安全的,并且是面向对象的。它们通常用于将方法作为参数传递给其他方法,实现回调功能。

委托的关键特性:

  1. 类型安全: 委托是类型安全的,这意味着方法的签名必须与委托的签名匹配。
  2. 多播: 一个委托可以持有对多个方法的引用。当调用该委托时,它会依次调用所有方法。
  3. 异步回调: 委托可以异步调用方法,使用BeginInvokeEndInvoke方法。

事件(Event):

事件是一种特殊形式的委托,专门用于信号通知。它提供了一种类之间或对象之间的通信方式,当某个事件发生时,一个类可以通知其他类。事件通常在发布-订阅模型的上下文中使用,其中一个类(发布者)发布事件,而其他类(订阅者)订阅该事件。

事件的关键特性:

  1. 封装性: 事件通过event关键字对委托进行封装,防止订阅者直接调用委托。
  2. 多播支持: 多个方法可以注册到一个事件,允许多个订阅者。
  3. 设计模式: 事件是C#中观察者设计模式的一部分,促进发布者和订阅者之间的松耦合。

示例:

我们在开发过程中,通常会遇到:在某一情况下,需要调用某个函数的时候,这个时候我们就可以使用委托与事件。

举个例子,在Unity中,如果要实现在按下某个按钮时,销毁某些物品,我们就可以使用委托与事件。

我在Unity中创建了三个物体,一个为胶囊体,一个是正方体,一个是圆球。我现在将实现当按下按键时,销毁胶囊和圆球。

 首先我们在正方体上面挂载一个SendEvent脚本,该脚本代码如下:

 1 using UnityEngine;
 2 
 3 public class SendEvent : MonoBehaviour
 4 {
 5     public int second = 5;
 6     public delegate void SendEventDelegate(int second);//声明委托
 7     public static event SendEventDelegate DestoryObject;//声明一个事件
 8 
 9     void Update()
10     {
11         if (Input.GetKeyDown(KeyCode.F1) && DestoryObject != null)
12         {
13             DestoryObject(second);
14         }
15     }
16 }

接着我们在要销毁的物体上面挂在一个ReciveEvent脚本,该脚本代码如下:

 1 using UnityEngine;
 2 
 3 public class ReciveEvent : MonoBehaviour
 4 {
 5     private void OnEnable()
 6     {
 7         SendEvent.DestoryObject += DestroyGameObject;//将销毁的函数添加到事件上
 8     }
 9 
10     private void OnDisable()
11     {
12         SendEvent.DestoryObject -= DestroyGameObject;//将销毁的函数从事件中消去
13     }
14 
15     public void DestroyGameObject(int second)
16     {
17         Destroy(gameObject, second);//销毁函数
18     }
19 }

其实上述的功能,我们通过Unity中自带的SendMessage方法也可以完成,因为这是一个很简单的调用,但是SendMessage方法使用了反射机制,性能开销大。

委托和事件,相对来说类型更加安全,并且一个事件可以有多个订阅者,在多订阅者的情况下很好用。这里的订阅者其实也就是DestroyGameObject函数,一个事件可以添加很多个函数,这样调用一个事件,就可以完成一系列的动作。并且委托和事件写代码属于松耦合,更加的灵活。

 

 

 

 

 

 

 

 

翻译

搜索

复制

标签:订阅,委托,C#,void,Unity,举例,事件,public
From: https://www.cnblogs.com/qingyuan0213/p/18209582

相关文章

  • Centos7.9安装卸载Docker
    目录1、官网安装1.1、卸载旧版本Docker1.2、通过rpm仓库安装1.2.1、设置仓库1.2.2、安装DockerEngine1.2.3、启动Docker1.2.4、验证安装1.3、通过rpm软件包安装1.4、通过便捷脚本安装2、yum安装2.1、安装docker-ce以及客户端2.2、启动docker2.3、配置镜像加速3、卸载Docker3.1、......
  • 初识c语言.1
    什么是c语言?语言?人与人交流:汉语、英语、俄语人与计算机交流——计算机语言:c\c++、JAVA、Python、GOc语言是一种通用的计算机编程语言,广泛应用于底层开发。底层软件开发:比如说买来一台电脑(硬件)要使电脑正常工作得需要操作系统(windows),而操作系统如何让硬件工作?需安装驱动(网......
  • pytorch-20 lstm实践
    一、LSTM预测类型数据类型:单变量、多变量与面板数据数据处理(滑窗方式):单变量有seq2seq,seq2point;多变量:特征滑窗,带标签滑窗1.数据类型:单变量、多变量与面板数据在时间序列的世界中,除了最常见的单变量时间序列之外,我们还有多变量时间序列数据和面板数据两种复杂经典数据结......
  • 基于Nacos实现Sentinel规则持久化
    基于Nacos实现Sentinel规则持久化一、Sentinel使用痛点二、解决方案2.1保存本地文件2.2保存数据库2.3保存到Nacos三、规则持久化到Nacos3.1Nacos服务端修改配置3.2Sentinel控制台修改配置3.3Nacos数据源整合到Sentinel中一、Sentinel使用痛点SpringCloudAlib......
  • 【C++】两个类的相互引用_c++ 类相互引用
    有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。那么这种情形下,两个类的设计上需要注意什么呢?同一文件尝试方案将A和B的定义都放在一个文件中,例如:#include<iostream>classA{public:......
  • PowerShell 中重置SQL SERVER数据库的 SA(System Administrator)密码可以通过 SQL Serve
    PowerShell中重置数据库的SA(SystemAdministrator)密码可以通过SQLServerManagementObjects(SMO)来完成。以下是一个基本的PowerShell脚本,可以用来重置SA用户的密码:powershellCopyCode#导入SQLServer模块Import-ModuleSQLPS-DisableNameChecking#设置SQL......
  • 「杂题乱刷」CF1650E
    题目链接CF1650E(luogu)CF1650E(codeforces)解题思路首先,你发现你只能改一个日期,那么我们肯定是改距离最近的旁边的两场考试,此时我们就可以将操作转化为删去一场考试并添加一场新考试的最小的休息时长,容易使用贪心\(O(n)\)解决。总时间复杂度\(O(n\log_2n)\),瓶颈在于......
  • docker error response from daemon no command specified
    概述这个错误是由于所运行的镜像没有默认的启动命令且在运行的时候也没有指定启动命令导致的。解决办法是在启动的时候指定容器的启动命令,比如:dockerrun-itmy_containerbash问题背景我pullredis镜像,然后使用dockerimagesave-o命令将其保存,然后再另一台主机上使用doc......
  • 「杂题乱刷」CF1650F
    题目链接CF1650F(luogu)CF1650F(codeforces)解题思路我们发现要想让第\(i\)个数变换一次就需要给第\(i\simn\)中的一个位置做一次操作,因此我们很自然的就想到了倒推,容易证明这样是不劣的。时间复杂度\(O(n^2)\)。参考代码#include<bits/stdc++.h>usingnamespace......
  • 【Python】数据分析 Section 6.4: Heatmaps | from Coursera “Applied Data Science
    Heatmapsareawaytovisualizethree-dimensionsofdataandtotakeadvantageofspatialproximityofthosedimensions.InmakingrevisionstothiscourseIwasreallytemptedtogetridofthesectiononheatmaps,asI'veseenenoughbadheatmapst......