Unity 3D中yield协程与消息传递

本文介绍如何在Unity3D中使用协程来优化Update函数中的逻辑,通过实例展示了如何利用协程实现定时任务,如烟花发射和角色复活等功能。

  1. 协程

  在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花、怪物死亡后20秒再复活之类的。刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这样写。

 1 float nowTime = 3.0f;
 2 bool isDead = true;
 3 float deadTime = 20.0f;
 4     
 5 void startFireworks()
 6 {
 7     // 放烟花
 8 }
 9 
10 void revival()
11 {
12     // 复活
13 }
14 
15 void Update () 
16 {
17     if (nowTime <= 0)
18     {
19         startFireworks();
20         nowTime = Random.Range(2.5f, 3.5f);
21     }
22     nowTime -= Time.deltaTime;
23     if (isDead)
24     {
25         if (deadTime <= 0)
26         {
27             revival();
28             isDead = false;
29             deadTime = 30.0f;
30         }
31         deadTime -= Time.deltaTime;
32     }
33 }

  当这样的需求多起来时,Update中凌乱不堪,如果有需求需要添加或者修改,将显得非常麻烦。尤其是类似死亡后复活这种需求,只是在死亡后等待30秒重新复活,其他时间根本不需要去执行,这样放在Update里面还需要每一帧去判断,显得很累赘。

好在Unity 3D支持yield协程,不懂没关系,先看看下面用协程实现上面的功能。

 1 void Start()
 2 {
 3     StartCoroutine(Fireworks());
 4 }
 5     
 6 void deadHandle()
 7 {
 8     StartCoroutine(Revival());
 9 }
10 
11 IEnumerator Fireworks()
12 {
13     while (true)
14     {
15         startFireworks();
16         yield return new WaitForSeconds(Random.Range(2.5f, 3.5f));
17     }
18 }
19 
20 IEnumerator Revival()
21 {
22     yield return new WaitForSeconds(30.0f);
23     revival();
24 }

  上面代码中,以IEnumerator作为返回值的函数就是协程,调用StartCoroutine()开始协程,在Start函数中调用StartCoroutine(Fireworks());,说明在开始时就开始执行协程Fireworks(),在deadHandle()中调用StartCoroutine(Revival());说明是在怪物死亡时开始执行协程。

  现在再来看看

转载自 http://doc.okbase.net/qinruijie/archive/93681.html

### 在Unity中运行协程的示例 在Unity中,协程通过`StartCoroutine`方法启动,并允许将任务分散到多个帧中执行[^3]。以下是具体实现示例: #### 示例代码:启动协程 ```csharp using System.Collections; using UnityEngine; public class CoroutineExample : MonoBehaviour { // 启动协程的示例 void Start() { // 使用字符串指定协程名称 StartCoroutine("WaitAndPrint", "Hello after 2 seconds"); // 直接传递IEnumerator方法 StartCoroutine(WaitAndPrintWithReturn("Hello with return after 2 seconds")); } // 定义一个简单的协程 IEnumerator WaitAndPrint(string message) { yield return new WaitForSeconds(2); // 等待2秒 Debug.Log(message); // 打印消息 } // 定义一个带有返回值的协程 IEnumerator WaitAndPrintWithReturn(string message) { yield return new WaitForSeconds(2); // 等待2秒 Debug.Log(message); // 打印消息 yield return null; // 返回空以结束协程 } } ``` 上述代码展示了如何通过`StartCoroutine`方法启动协程。可以使用字符串指定协程名称或者直接传递`IEnumerator`方法[^1]。 #### 停止协程的示例 除了启动协程,还可以通过`StopCoroutine`方法停止正在运行的协程。以下是一个示例: ```csharp using System.Collections; using UnityEngine; public class StopCoroutineExample : MonoBehaviour { private Coroutine coroutine; void Start() { // 启动协程并保存引用 coroutine = StartCoroutine(WaitAndPrint()); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 按下空格键时停止协程 StopCoroutine(coroutine); } } IEnumerator WaitAndPrint() { for (int i = 0; i < 5; i++) { yield return new WaitForSeconds(1); // 每隔1秒打印一次 Debug.Log("Still running..."); } } } ``` 在该示例中,当按下空格键时,会调用`StopCoroutine`方法停止协程。 #### 协程提供的延迟类 协程提供了多种延迟类,例如`WaitForSeconds`、`WaitForFixedUpdate`等,用于控制协程的执行节奏[^2]。这些类可以帮助开发者精确地控制协程的行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值