-
在Unity中,委托和事件是相似的,因为它们都允许你将函数作为参数传递,它们都可以用于创建回调系统。然而,两者之间存在一些差异
-
委托是一种类型,它表示对具有特定签名的方法的引用。它们可用于将函数作为参数传递给其他函数,或存储对函数的引用以供以后使用。当调用委托时,它调用它引用的方法。
-
另一方面,事件是创建回调系统的一种方式,可以在其中注册多个函数,以便在发生特定事件时调用。事件基于委托,可以看作委托的集合。它们可以用来在发生事情时通知其他对象,比如当按钮被点击时,或者当动画结束播放时。
下面是一个例子来说明委托和事件之间的区别:
`
``csharp
using UnityEngine;
using System;
public class Example : MonoBehaviour
{
//声明委托类型
delegate void MyDelegate(string message);
// 声明事件类型
event MyDelegate MyEvent;
// 使用委托将函数作为参数传递
void UseDelegate(MyDelegate del)
{
del("Hello from the delegate!");
}
// 当有事情发生时,使用事件通知多个函数
void UseEvent()
{
MyEvent("Hello from the event!");
}
void Start()
{
// 创建一个委托并将其传递给UseDelegate函数
MyDelegate myDelegate = Debug.Log;
UseDelegate(myDelegate);
//用事件注册一个函数
MyEvent += Debug.Log;
// Call the UseEvent function, which will invoke all registered functions
UseEvent();
}
}
-
在这个例子中,MyDelegate委托类型是用一个带有字符串参数的签名来定义的。UseDelegate函数接受MyDelegate委托作为参数,并使用给定的消息调用它。
MyEvent事件是使用MyDelegate委托类型声明的。可以使用+=操作符将函数注册到事件,当调用UseEvent函数引发事件时,将使用给定的消息调用所有已注册的函数。
在Start函数中,使用Debug.Log作为要调用的方法创建MyDelegate委托,然后将其传递给UseDelegate函数。使用+=操作符将调用Debug.Log的匿名函数注册到MyEvent事件。最后,调用UseEvent函数,它将调用所有已注册的函数,并传递消息“来自事件的Hello
!”
签名不是没有方法体的方法,而是对方法、委托或事件的参数和返回类型的描述。