我眼中的协同(unity IEnumerator )

怎么理解协同?

在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。可以用来控制运动、序列以及对象的行为。

大家做程序员,应该都能明白什么是主线程序,按照上面的说法,可以知道协同并非线程。

一般什么地方能使用到协同?

想要实现一些延时等待,操作完成之后在执行后面的代码的时候都可以使用协同进行实现,比如说使用www加载资源,等到加载完成在把图片拿出来使用,比如打开某个界面后两秒钟播放一个特效。

如何使用

直接上例子:
void Main()

{

        StartCoroutine(WaitForOneSec());//调用协同必须使用StartCoroutine

}

IEnumerator WaitForOneSec()//返回值必须是IEnumerator

{

        yield return new WaitForSeconds(1);//必须有yield return来返回,目前这句的意思是等待一秒终止后执行后面一句话。

        Debug.LogError("wait over");

}

返回值类型

yield return null相当于挂起一帧,什么意思呢?如果一个协同里面有一句yield return null执行顺序为:1.调用协同函数-->2.直接进入协同函数内部执行代码---->3.执行到yield return null挂起 ----->4.执行Update-->5.执行LastUpdate--->6.

### Unity 协同程序 (Coroutine) 的基本概念 在 Unity 中,协同程序(Coroutine)是一种特殊的函数,它可以暂停其执行并稍后从中断处恢复。这种机制使得开发者可以在不阻塞主线程的情况下完成复杂的逻辑操作[^1]。 #### 启动协同程序 通过 `StartCoroutine()` 方法启动一个协同程序。该方法接受一个返回类型为 `IEnumerator` 的函数作为参数。以下是启动协同程序的基本语法: ```csharp IEnumerator MyCoroutine() { yield return null; } void Start() { StartCoroutine(MyCoroutine()); } ``` 上述代码展示了如何定义和启动一个简单的协同程序[^4]。 --- ### 协同程序的核心功能 #### 1. **延迟执行** 可以通过 `yield return new WaitForSeconds(float seconds)` 实现指定时间后的延迟执行。例如: ```csharp IEnumerator DelayedAction() { Debug.Log("开始"); yield return new WaitForSeconds(2); // 延迟两秒 Debug.Log("结束"); } ``` 此代码将在日志中打印“开始”,等待两秒钟后再打印“结束”[^3]。 #### 2. **循环调用** 利用无限循环配合 `WaitForSeconds` 可以实现周期性的任务调度。例如模拟每秒更新一次的操作: ```csharp IEnumerator RepeatedTask() { while (true) { Debug.Log("每隔一秒触发一次"); yield return new WaitForSeconds(1); } } ``` 这段代码会持续运行直到手动停止或满足退出条件[^2]。 --- ### 控制协同程序的行为 #### 终止协同程序 如果需要提前终止某个正在运行中的 Coroutine,则可通过 `StopCoroutine(IEnumerator routine)` 来做到这一点。比如下面的例子演示了如何安全地中止先前开启的任务: ```csharp private IEnumerator myRoutine; void Start() { myRoutine = ExampleCoroutine(); StartCoroutine(myRoutine); } void StopExample() { if (myRoutine != null) { StopCoroutine(myRoutine); } } IEnumerator ExampleCoroutine() { int counter = 0; while (counter < 5) { Debug.Log(counter++); yield return null; } } ``` 这里展示了一个计数器,在达到五次迭代之前都可以随时被叫停。 --- ### 协同程序的优点与局限性 尽管 coroutine 提供了一种简单的方式来处理异步行为,但它也有一些需要注意的地方: - 它们本质上仍然是单线程上的操作;因此不适合用于 CPU 密集型计算。 - 如果滥用或者管理不当的话容易造成内存泄漏等问题。 对于更复杂的需求可能还需要考虑其他解决方案如 Task Parallel Library(TPL),不过这超出了当前讨论范围。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值