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


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值