UnityAction的用法

目录

命名空间

定义

使用

调用方法


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() 方法。


个人学习笔记,如有错误欢迎各位批评指正。

猜你喜欢

转载自blog.csdn.net/weixin_46041788/article/details/130403424