一、什么是UnityAction
UnityAction是Unity3D中的一个委托(delegate),它是UnityEvent的基础。它可以将一组方法绑定到一个委托上,使这组方法可以一起被调用。UnityAction可以作为委托类型作为UnityEvent的参数被使用。
示例代码:
public delegate void UnityAction();
public class Example : MonoBehaviour {
public UnityAction myAction;
void Start(){
if (myAction != null)
myAction();
}
void Update(){
if (Input.GetKeyDown(KeyCode.Space) && myAction != null)
myAction();
}
}
二、UnityAction带参数
UnityAction也支持带参数的委托。创建带参数的UnityAction时,必须确保参数类型与绑定的方法的参数类型完全一致。对于多个参数的方法,可以使用System.Action<T1, T2, …, Tn>,其中T1,T2,…,Tn是各个参数的类型。
示例代码:
public delegate void UnityActionWithArgs(int val1, float val2);
public class Example : MonoBehaviour {
public static event UnityActionWithArgs onAction;
private void Start() {
onAction?.Invoke(1, 1.23f);
}
}
三、UnityEvent与UnityAction调用方式
1.UnityEvent
UnityEvent对UnityAction进行了进一步的封装,提供了更多功能,例如Ajax、PlayOneShot和订阅者的持久存储。UnityEvent使用AddListener()方法添加回调函数,RemoveListener()方法移除回调函数,并使用Invoke()方法调用回调函数。 UnityEvent也可以使用generic参数来传递参数。
示例代码:
using UnityEngine;
using UnityEngine.Events;
public class Example : MonoBehaviour {
public UnityEvent buttonEvent;
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
buttonEvent.Invoke();
}
}
}
2.UnityAction.Invoke()
UnityAction也可以与Invoke()一起使用,直接调用UnityAction中的方法。
示例代码:
public class Example : MonoBehaviour {
public UnityAction myAction;
void Start() {
if (myAction != null) {
myAction.Invoke();
}
}
void Update() {
if (Input.GetKeyDown(KeyCode.Space) && myAction != null) {
myAction.Invoke();
}
}
}
四、UnityAction Invoke无参数和带参数的区别
UnityAction的Invoke()方法可以不带参数调用,也可以带参数调用。如果UnityAction没有参数,则Invoke()方法可以直接调用。如果UnityAction有参数,则Invoke()方法必须将与UnityAction相同的参数传递进去。
示例代码:
public class Example : MonoBehaviour {
public UnityAction myActionWithoutArgs;
public UnityAction<string> myActionWithArgs;
void Start() {
if (myActionWithoutArgs != null) {
myActionWithoutArgs.Invoke();
}
if (myActionWithArgs != null) {
myActionWithArgs.Invoke("Hello, world!");
}
}
void Update() {
// 同上...
}
}
五、Unity委托详解
在Unity中,有多种类型的委托可供使用。除了UnityAction和UnityEvent之外,常用的委托类型还包括:System.Action、System.Func、以及自定义委托类型。
1.System.Action
System.Action与UnityAction非常相似,它们都是没有返回值的委托类型。Action定义了不同参数数量和类型的委托。例如,Action<T>表示带单个参数类型T的委托,Action<T1, T2>表示带有两个参数类型T1和T2的委托。
示例代码:
public class Example : MonoBehaviour {
public System.Action myActionNoArgs;
public System.Action<string> myActionWithArgs;
void Start() {
if (myActionNoArgs != null) {
myActionNoArgs();
}
if (myActionWithArgs != null) {
myActionWithArgs("Hello, world!");
}
}
void Update() {
// 同上...
}
}
2.System.Func
System.Func是带返回值的委托类型,其返回类型是指定的类型。System.Func的定义方式与System.Action类似,它可以定义具有不同个数和类型的参数的委托。
示例代码:
public class Example : MonoBehaviour {
public System.Func<int, float, bool> myFunc;
void Start() {
bool result = myFunc(1, 1.23f);
if (result) {
// do something
}
}
void Update() {
// 同上...
}
}
3.自定义委托类型
自定义委托类型可以通过定义自己的类来实现。它可以定义各种类型的返回值和参数。
示例代码:
public delegate void CustomEvent(int id);
public class Example : MonoBehaviour {
public CustomEvent customEvent;
void Start() {
if (customEvent != null) {
customEvent(10);
}
}
void Update() {
// 同上...
}
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/194564.html
微信扫一扫
支付宝扫一扫