一、什麼是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/zh-hant/n/194564.html
微信掃一掃
支付寶掃一掃