unity协程(corounines)学习理解兼迭代器学习,异步多任务处理

*本文原创,表明来源可随意转载,主要是记录自己在学习过程中遇到的问题,故不作为教程。如果有大佬愿意指导纠正,区区拜谢。

一.协程学习的前置知识

迭代器

迭代器是一种用于简化循环结构的语法糖,它可以让我们通过一种更加简洁、优雅的方式来遍历一个集合或者执行一些需要多次迭代的操作。

在Unity中,迭代器的基本语法是使用yield return语句。yield return语句用于暂停迭代器的执行,并返回一个值或对象。

下面是一个使用迭代器的例子:

IEnumerator MyIterator() {
    Debug.Log("Start");
    yield return new WaitForSeconds(1.0f);
    Debug.Log("1 second later");
    yield return new WaitForSeconds(2.0f);
    Debug.Log("2 seconds later");
}

二.协程的入口

协程必须以IEnumerator开始,并且方法中必须包含关键字yield return,下面我们给出一个协程和普通程序的对比:

IEnumerator PrintDebug()
{
    Debug.Log(1);
    yield return 0;//暂时挂起程序
}
void PrintDebug()
{
    Debug.Log(1);
}

这时我们想要调用我们的协程就需要用到以下的代码

StartCoroutine(PrintNum());

关键字yield return

yield return的作用是将我们的程序暂时挂起,满足部分条件之后再执行

下面是一些例子:

yield return null;//下一帧以后执行后续代码
yield return 0;//这里可以不是零,甚至可以是任意数字,效果同上
yield return StartCoroutine(MyCoroutine(1));//等待协程MyCoroutine(1)完成
yield return new WaitForSeconds(1); // 暂停协程1秒钟,受到DeletaTime影响
yield return new WaitForSecondsRealtime(1);//不受到DeletaTime影响
yield return new WaitForFixedUpdate(); // 等待下一个FixedUpdate消息
yield return new WaitForEndOfFrame(); // 等待下一个渲染帧的结束
yield return new WaitUntil(() => oneSecond>1);//等到某判断条件为真时
yield return new WaitWhile(() => oneSecond>1);//等到某判断条件为假时

AsyncOperation async = SceneManager.LoadSceneAsync("SceneName");//暂停协程,异步场景加载
yield return async; // 等待场景加载完成

yield break;//直接终止,类似于return操作

不仅如此,你甚至能使用自定义的yield return,请看代码

public class MyYieldInstruction : CustomYieldInstruction {
    private bool isFinished = false; // 是否完成的标志位

    public override bool keepWaiting {
        get {
            return !isFinished; // 当未完成时,协程继续等待
        }
    }

    public void Finish() {
        isFinished = true; // 设置完成标志位
    }
}

众所周知,自定义yield return类型需要满足以下两个条件:

  1. 继承自Unity的CustomYieldInstruction类。

  1. 实现keepWaiting属性,该属性的返回值控制协程是否继续等待。

在上面的示例中,MyYieldInstruction类继承自CustomYieldInstruction类,并实现了keepWaiting属性和Finish方法。在MyYieldInstruction类中,我们使用isFinished变量表示自定义的操作是否完成。在keepWaiting属性中,当isFinished为false时,协程将继续等待;当isFinished为true时,协程将不再等待,继续执行后面的代码。

以下的代码会告诉你该如何使用前面我们自定义的yield return

IEnumerator MyCoroutine() {
    Debug.Log("Start");
    MyYieldInstruction myYield = new MyYieldInstruction();
    yield return myYield;
    Debug.Log("Finish");
}

...

MyCoroutine coroutine = StartCoroutine(MyCoroutine());
coroutine.Stop(); // 可以通过Stop方法提前终止协程

值得注意的是,在使用自定义yield return类型时,需要特别注意协程的终止条件,以避免出现不可预期的结果。

StartCoroutine语句

StartCoroutine(方法);
StartCoroutine(方法名);
StartCoroutine的返回值类型是IEnumerator
注意:StartCoroutine语句只能在MonoBehaviour派生类的方法中使用,因为协程依赖于Unity的消息循环机制。

三.协程的结束

StopCoroutine(方法);
StopAllCoroutine();

四.迭代器与协程的区别

迭代器(Iterator)和协程(Coroutine)在Unity中都用于异步操作,但它们在实现和使用上有一些区别。

  1. 实现方式不同

迭代器是一种基于枚举器(Enumerator)实现的语法,通过yield return语句实现协程的暂停和恢复。在编写迭代器时,需要实现IEnumerator和IEnumerable接口,并实现MoveNext、Reset和Current等方法。

协程是一种基于IEnumerator实现的语法,通过StartCoroutine和yield return语句实现协程的启动和暂停。在编写协程时,需要定义一个返回值为IEnumerator类型的方法,并使用yield return语句来暂停协程的执行。

  1. 使用方式不同

迭代器通常用于实现可枚举类型的遍历,可以通过foreach语句进行遍历操作。在协程中,迭代器通常用于实现异步操作,例如延迟执行、动画效果等。

协程通常用于实现异步操作,可以通过StartCoroutine语句启动协程,并使用yield return语句实现协程的暂停和恢复。协程可以通过yield return语句实现延迟执行、分步执行、等待操作完成等功能。

  1. 执行顺序不同

迭代器的执行顺序是在同一线程中顺序执行,即在迭代器中的每个yield return语句执行完毕后,才会执行下一个yield return语句或方法的其他部分。

协程的执行顺序是异步的,即在协程执行过程中可以执行其他代码。协程的执行可以被暂停和恢复,可以实现延迟执行、动画效果、等待操作完成等功能。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

車部拟幻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值