unity中coroutine(2)

本文详细介绍了Unity中协程的基本概念及使用方法,包括协程的启动、停止、常见用法和注意事项。通过示例代码展示了如何创建延时操作、启动多个协程以及使用不同类型的中断指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在unity中,协程是一个特殊的函数,它通过使用yield语句中断执行当前的代码,直到中断指令(YieldInstruction)结束后再接着之前的代码继续执行。

在C#中写协程需要遵循的规则有:
1.协程的返回值必须是IEnumerator
2.协程的参数不能有 ref或out的关键字
3.在C#脚本中,必须通过StartCoroutine来启动协程
4.yield语句要用yield return来代替。
5.在MonoBehaviour子类的Update和FixedUpdate函数里不能使用yield语句,但可以启动协程。

下面是使用C#写协程的例子:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
using UnityEngine;
using System.Collections;

public class TestCorutine : MonoBehaviour {

    // Use this for initialization
    IEnumerator Start () {
        print("Start");
        yield return new WaitForSeconds(5);//1.程序会在这里等待5s后再往下执行。
        print( "after Wait" );
        StartCoroutine( DoFunc() );//2.使用StartCoroutine启动了协程

        print("After StartCoroutine");
    }

    IEnumerator DoFunc()
    {
        print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>hello I'm DoFunc");
        yield return new WaitForSeconds(10);
        print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>End DoFunc");
    }
}
//执行的结果
//Start
//after Wait
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>hello I'm DoFunc
//After StartCoroutine
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>End DoFunc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

unity中协程相关的类有:WaitForSeconds、WaitForFixedUpdate、Coroutine、WaitForEndOfFrame、AsyncOperation。
常用的yield return语句有:

形式意义
yield return null等待下一帧中的update行完后再继续执行
yield return new WaitForSeconds(10)延迟10s后执行
yield return new WaitForFixedUpdate()等待所有的脚本的FixedUpdate函数执行完后在继续执行
yield return new WWW(url)等待url下载完后再继续执行
yield return StartCoroutine(MyFunc)等待协程MyFunc执行完后再执行

StartCoroutine函数是MonoBehaviour的一个类成员函数。

        public Coroutine StartCoroutine(IEnumerator routine);
        public Coroutine StartCoroutine(string methodName);
        public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value); 
  • 1
  • 2
  • 3

所有StartCoroutine只能在MonoBehaviour或者其子类中使用,它只接收协程函数名字,或者IEnumerator实例作为参数。

在untiy中使用StopCoroutine来终止一个协程,使用StopAllCoroutine终止所有该MonoBehaviour中能终止的协程。还有一种方法是将MonoBehaviour脚本挂载的GameObject的active属性设为false.
最后yield return不能使用在try-catch语句块中,但可以写在try-finally语句快的try语句块中。不能写在匿名方法中,不能写在unsafe语句块中

### 如何在 Unity 中停止或中断 Coroutine 协程 在 Unity 中,可以通过多种方式来控制协程的生命周期。具体来说,可以使用 `StopCoroutine` 和 `StopAllCoroutines` 方法来终止正在运行的协程。 #### 使用 `StopCoroutine` 当需要停止特定名称的协程时,应确保启动和停止的方式保持一致: - 如果通过字符串名称启动协程,则需同样以字符串形式停止: ```csharp StartCoroutine("MyRoutine"); StopCoroutine("MyRoutine"); // 停止名为 "MyRoutine" 的协程[^1] ``` - 若是以返回的 `IEnumerator` 对象作为参数启动协程,则应当用相同的对象实例去停止它: ```csharp var routine = StartCoroutine(MyRoutine()); StopCoroutine(routine); // 使用 IEnumerator 实例停止协程[^2] ``` 对于带有参数的情况,应该按照启动时的形式匹配地进行停止操作: ```csharp // 启动带参数的协程 StartCoroutine(Test(1)); // 正确的方法是提供完全相同签名的方法调用来停止 StopCoroutine(Test(1)); // 参数列表要与启动时相匹配 // 或者如果知道确切的名字也可以这样做 StopCoroutine("Test", 1); ``` 需要注意的是,在某些情况下直接尝试像 `StopCoroutine(Cor_1())` 这样做可能会失败,因为这里实际上是在创建一个新的而非现有的协程引用[^3]。 #### 使用 `StopAllCoroutines` 有时可能希望一次性清除当前脚本组件上的所有活动协程,这时就可以简单地调用: ```csharp StopAllCoroutines(); // 关闭此MonoBehaviour上所有的协程 ``` 这种方法适用于那些不需要区分单个协程而想要全部结束的情形。 另外值得注意的一点是,禁用 MonoBehaviour 组件 (`this.enabled = false`) 并不会影响已经启动的协程;只有当整个 GameObject 被设置为不活跃状态(`gameObject.SetActive(false)`)时才会同时暂停其下的更新逻辑以及任何正在进行中的协程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值