目录
UnityAction 是 Unity3D 中的一个泛型委托类,它用于封装无参数和无返回值的方法,主要用于在 Unity 中处理事件和委托。
命名空间
using UnityEngine.Events;
定义
public UnityAction myAction;//private,protect都可,看用法
使用
方法1:直接使用方法体给到委托内容
public class Example : MonoBehaviour
{
private UnityAction myAction;//各访问类型都可,具体看使用场景
void Start()
{
myAction = MyMethod;
Invoke("CallMyAction", 2f);//延迟两秒唤起CallMyAction方法
}
void CallMyAction()
{
myAction.Invoke();//唤起myAction
}
void MyMethod()
{
Debug.Log("MyMethod called!");
}
}
方法2:自增运算符和自减运算符
public class Example : MonoBehaviour
{
private UnityAction myAction1;
private UnityAction myAction2;
void Start()
{
myAction1 = MyMethod1;
myAction2 = MyMethod2;
// 向 myAction1 增加 MyMethod2 方法
myAction1 += myAction2;//也可以是myAction1 += MyMethod2;
myAction1.Invoke(); // 调用 myAction1 委托
// 从 myAction1 移除 MyMethod2 方法
myAction1 -= myAction2;//也可以是myAction1 -= MyMethod2;
myAction1.Invoke(); // 再次调用 myAction1 委托,这次只调用 MyMethod1 方法
}
void MyMethod1()
{
Debug.Log("MyMethod1 called!");
}
void MyMethod2()
{
Debug.Log("MyMethod2 called!");
}
}
如果从 UnityAction 委托中移除一个方法,但是该方法还没有被添加到委托中,可以使用 -= 运算符进行移除,这不会引发异常, -= 运算符也不会执行任何操作。
方法3:匿名方法
public class Example : MonoBehaviour
{
private UnityAction myAction;
void Start()
{
myAction = delegate { Debug.Log("MyMethod1 called!"); };
myAction += delegate { Debug.Log("MyMethod2 called!"); };
myAction.Invoke(); // 调用 myAction 委托,依次调用 MyMethod1 和 MyMethod2 方法
myAction -= delegate { Debug.Log("MyMethod2 called!"); };
myAction.Invoke(); // 再次调用 myAction 委托,只调用 MyMethod1 方法
}
}
需要注意,当使用匿名方法给 UnityAction 委托赋值时,委托类型的参数列表和返回类型必须与方法签名匹配,否则会编译错误。
调用方法
myAction.Invoke();
或者
myAction();
更新(2023.05.15)
查看后台发现好多同学是搜索 UnityAction?.Invoke() 进入文章的,所以想着更新一下。
看见问号就很容易想到条件运算符 ? :
Exp1 ? Exp2 : Exp3;
相当于
if(Exp1)
{
Exp2;
}
else
{
Exp3;
}
而在 UnityAction?.Invoke() 中 ? 是作为null 合并运算符存在的。
表示,如果 UnityAction 为 null,那么不会调用 Invoke() 方法,也不会发生 NullReferenceException 异常。如果 UnityAction 不为 null,那么会调用 Invoke() 方法。
个人学习笔记,如有错误欢迎各位批评指正。