lua协程 unity_unity协程coroutine浅析

本文深入探讨Unity中的协程Coroutine,从C#的基本概念如IEnumerator、yield return、yield break出发,解析协程的编译结果,并通过示例说明协程的工作原理。此外,文章还讨论了Lua中的协程实现,以及如何在C#和Lua之间协调协程执行。
摘要由CSDN通过智能技术生成

一、序言

在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下,通过前辈的文章大体理解了一下,在这儿抛砖引玉写一些个人理解。当然首先给出几篇写的非常精彩优秀的文章,最好认真拜读一下:

好了,接下来就从一个小白的视角开始理解协程。

二、常见使用协程的示例

经常,我们会利用monobehaviour的startcoroutine来开启一个协程,这是我们在使用unity中最常见的直观理解。在这个协程中执行一些异步操作,比如下载文件,加载文件等,在完成这些操作后,执行我们的回调。 举例说明:

public static void Download(System.Action finishCB)

{

string url = "https: xxxx";

StartCoroutine(DownloadFile(url));

}

private static IEnumerator DownloadFile(string url)

{

UnityWebRequest request = UnityWebRequest.Get(url);

request.timeout = 10;

yield return request.SendWebRequest();

if(request.error != null)

{

Debug.LogErrorFormat("加载出错: {0}, url is: {1}", request.error, url);

request.Dispose();

yield break;

}

if(request.isDone)

{

string path = "xxxxx";

File.WriteAllBytes(path, request.downloadHandler.data);

request.Dispose();

yiled break;

}

}

这个例子中,用到了几个关键词: IEnumerator/yield return xxx/ yield break/StartCoroutine, 那么我们从这几个关键词入手,去理解这样的一个下载操作具体实现。

1、关键词 IEnumerator

这个关键词不是在Unity中特有,unity也是来自c#,所以找一个c#的例子来理解比较合适。首先看看IEnumerator的定义:

public interface IEnumerator

{

bool MoveNext();

void Reset();

Object Current{get;}

}

从定义可以理解,一个迭代器,三个基本的操作:Current/MoveNext/Reset, 这儿简单说一下其操作的过程。在常见的集合中,我们使用foreach这样的枚举操作的时候,最开始,枚举数被定为在集合的第一个元素前面,Reset操作就是将枚举数返回到此位置。

迭代器在执行迭代的时候,首先会执行一个 MoveNext, 如果返回true,说明下一个位置有对象,然后此时将Current设置为下一个对象,这时候的Current就指向了下一个对象。当然c#是如何将这个IEnumrator编译成一个对象示例来执行,下面会讲解到。

2、关键词 Yield

c#中的yield关键词,后面有两种基本的表达式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值