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

委托(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函数,一个事件可以添加很多个函数,这样调用一个事件,就可以完成一系列的动作。并且委托和事件写代码属于松耦合,更加的灵活。

 

 

 

 

 

 

 

 

posted @ 2024-05-23 23:22  Jet清远  阅读(206)  评论(0编辑  收藏  举报