obsidian/笔记文件/2.笔记/Unity3D 的协程与迭代器(Coroutine与Enumerator IEnumerable)详解.md
2025-03-26 00:02:56 +08:00

5.0 KiB
Raw Permalink Blame History

#unity/日常积累

前言

Unity3D是一款强大的游戏开发引擎它提供了许多高级功能使得开发者能够轻松地创建复杂的游戏逻辑和交互。其中协程Coroutine与迭代器Enumerator是Unity3D中非常重要的两个概念它们可以帮助开发者实现异步操作和流程控制。本文将详细介绍协程与迭代器的概念、使用方法以及代码实现。

一、协程Coroutine的概念与使用方法 协程是一种特殊的函数它可以在执行过程中暂停并在需要时恢复执行。在Unity3D中协程可以用来实现异步操作例如延迟执行、动画播放、网络请求等。协程的使用方法如下

声明协程函数 在C#中协程函数的返回类型为IEnumerator函数体内部使用yield关键字来控制协程的执行流程。例如下面的代码演示了一个简单的协程函数它会在3秒后打印一条消息

IEnumerator DelayCoroutine() {    yield return new WaitForSeconds(3);    Debug.Log("Coroutine executed after 3 seconds."); }

启动协程 在Unity3D中可以使用StartCoroutine方法来启动协程。例如下面的代码演示了如何启动上述的协程函数

StartCoroutine(DelayCoroutine());

停止协程 可以使用StopCoroutine方法来停止正在执行的协程。例如下面的代码演示了如何停止上述的协程函数

StopCoroutine(DelayCoroutine());

二、迭代器Enumerator的概念与使用方法 迭代器是一种特殊的对象它可以在集合中依次遍历元素。在Unity3D中迭代器可以用来实现流程控制例如循环、条件判断等。迭代器的使用方法如下

声明迭代器函数 在C#中迭代器函数的返回类型为IEnumerator函数体内部使用yield关键字来返回每个元素。例如下面的代码演示了一个简单的迭代器函数它会依次返回1、2、3

IEnumerator CountEnumerator() {    yield return 1;    yield return 2;    yield return 3; }

遍历迭代器 可以使用foreach循环来遍历迭代器返回的元素。例如下面的代码演示了如何遍历上述的迭代器函数

foreach (int num in CountEnumerator()) {    Debug.Log(num); }

手动控制迭代器 可以使用迭代器对象的MoveNext方法和Current属性来手动控制迭代器的执行流程。例如下面的代码演示了如何手动控制上述的迭代器函数

IEnumerator enumerator = CountEnumerator(); while (enumerator.MoveNext()) {    int num = (int)enumerator.Current;    Debug.Log(num); }

三、协程与迭代器的结合应用 协程与迭代器可以结合使用实现更复杂的异步操作和流程控制。例如下面的代码演示了一个协程函数与迭代器函数结合使用的例子它会在每隔1秒打印一个数字并在打印完3个数字后停止

IEnumerator PrintNumbersCoroutine() {    IEnumerator enumerator = CountEnumerator();    while (enumerator.MoveNext())    {        int num = (int)enumerator.Current;        Debug.Log(num);        yield return new WaitForSeconds(1);    }    Debug.Log("Coroutine executed after printing 3 numbers."); }

可以使用StartCoroutine方法启动上述的协程函数

StartCoroutine(PrintNumbersCoroutine());

通过上述的代码实例,我们可以看到协程与迭代器的强大之处。它们可以帮助开发者实现复杂的异步操作和流程控制,使得游戏开发更加灵活和高效。

Case1:IEnumerable(可枚举/迭代的)

如果一个类实现了IEnumerable接口则称为此类为可迭代的要实现IEnumerable接口就要实现IEnumerable中定义的GetEnumerator()的方法生成一个迭代器(IEnumerator)。

IEnumerable是所有集合类型接口的基接口如ICollection、IListIEnumerable只能进行读操作其具有延迟执行的特性ICollection、IList的实现类支持增删改查IList的实现类支持的操作更多、更加灵活如插入元素、移除元素等。

Case2:IEnumerator(迭代器)

如果我们把实现IEnumerable[可迭代的]看做一个类可以进行迭代的标记那么IEnumerator[迭代器]就相当于迭代时的工作引擎,迭代中的主要工作都需要依靠迭代器进行。

Case3:Foreach相关
  • Case3-1 什么样的类可以进行Foreach迭代

    实现IEnumerable接口的类。换一个更强的定义实现了IEnumerable接口同时实现了接口中的GetEnumerator方法。

  • Case3-2 Foreach究竟做了哪些事情

总结: 本文详细介绍了Unity3D中协程与迭代器的概念、使用方法以及代码实现。协程可以用来实现异步操作例如延迟执行、动画播放、网络请求等迭代器可以用来实现流程控制例如循环、条件判断等。协程与迭代器可以结合使用实现更复杂的异步操作和流程控制。希望本文能够帮助读者更好地理解和应用协程与迭代器。