UnityAction详解

一、什么是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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-02 14:39
下一篇 2024-12-02 14:39

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论