Coroutines 是可以与主游戏执行循环并行运行的函数。。。


本教程的视频版本目前尚未提供该语言版本。您可以在下方观看带字幕的英文版视频;视频下方提供了翻译成中文的文字稿。


视频文字稿

大家好!

欢迎来到这个关于在 Unity 中使用 Coroutines 的基础教程。

Coroutines 是可以与主游戏执行循环并行运行的函数。

在本教程中,我将通过一个实际示例来解释这一概念,同时介绍 WaitForSeconds 函数。该函数可以让我们在执行操作时等待指定的秒数。

本教程假设你已经具备 Unity 中 C# 编程的基础知识。教程使用的是 Unity 2022 版本进行录制,但 Coroutines 在许多编程语言以及 Unity 的早期版本中也同样可用。

我们的目标是让大炮每 3 秒自动发射一个炮弹 Prefab 一个简单的黑色球体 直到发生一个外部事件来中断这个过程。

在本例中,外部事件是用户按下 S 键 Stop。

首先,我们需要为大炮创建一个脚本,并将其命名为 autoshoot。

在主类中,我定义了三个变量,用于指定炮弹相对于大炮的起始位置:

public GameObject spawnPrefab;

我将在 Unity Editor 中把炮弹 prefab 关联到这个 public 变量。

Vector3 spawnPosition;

Quaternion spawnRotation;

我已经计算好了这个位置和初始方向,因此在 Start 函数中对这两个值进行初始化:

spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);

spawnRotation = Quaternion.Euler(-10f, -90f, 0f);

显然,我们需要实现一个无限重复的循环 除非被外部事件中断 并且在每次循环之间加入一个 3 秒的延迟。

注意:炮弹 prefab 自带一个脚本,在启动时会给炮弹一个向前的初速度,并在 3 秒后自动销毁对象,以避免虚拟世界或系统内存中堆积过多炮弹。

WaitForSeconds 指令允许我们暂停指定的时间,在本例中为 3 秒。

现在,我们需要创建一个 WHILE 块来执行主循环 目前我在脚本的空白位置编写它:

while(true) {

GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);

yield return new WaitForSeconds(3);

}

那么,这个 WHILE 块应该放在哪里呢?

它不能放在 Start 中,因为在那里不能使用 yield WaitForSeconds。另外,把它放在 Update 中也不合适,因为 Update 在游戏的每一帧都会被调用,无法实现延迟效果。

因此,我们必须创建一个名为 shoot 的函数,返回类型为 IEnumerator,并在其中包含 WHILE 块。

这个函数将允许我们使用 StartCoroutine 指令来启动一个 Coroutine,并在双引号中传入函数名作为参数。

由于大炮需要立即开始射击,我们在 Start 中,在初始化 spawnPosition 和 spawnRotation 之后,写入:

StartCoroutine("shoot");

现在保存脚本,然后到编辑器中测试目前为止定义的脚本。

为了能够停止或重新启动 Coroutine,我们回到脚本中并添加两条语句。

我们可以通过检测是否按下 S 键来停止 Coroutine,然后调用 StopCoroutine 函数,并将 "shoot" Coroutine 作为参数传入。

同样,我们可以通过检测是否按下 R 键来重新启动 Coroutine,并调用 StartCoroutine 函数,将 "shoot" 作为参数传入。

因此,在 Update 中写入:

if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");

if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

添加这些语句后,保存脚本并返回 Unity Editor 进行测试。

本次简短教程到此结束,希望对你有所帮助。我们下次再见!

搜索教程

输入短语,或输入多个用逗号分隔的关键词进行搜索。

这是一个个人网站,并非销售渠道。3D 模型相关页面仅用于记录我的部分作品,不包含任何销售要约、价格、购买方式或商业链接。目前,我不接受定制项目、咨询或其他任何形式的专业合作请求。


高级隐私策略信息和cookie文件的使用