协程相关

https://www.cnblogs.com/zblade/p/9857808.html

线程(Thread)和协程(Coroutine)      

        D.S.Qiu觉得使用协程的作用一共有两点:1)延时(等待)一段时间执行代码;2)等某个操作完成之后再执行后面的代码。总结起来就是一句话:控制代码在特定的时机执行。

        很多初学者,都会下意识地觉得协程是异步执行的,都会觉得协程是C# 线程的替代品,是Unity不使用线程的解决方案。

        所以首先,请你牢记:协程不是线程,也不是异步执行的。协程和 MonoBehaviour 的 Update函数一样也是在MainThread中执行的。使用协程你不用考虑同步和锁的问题。

IEnumerator & Coroutine

        协程其实就是一个IEnumerator(迭代器),IEnumerator 接口有两个方法 Current 和 MoveNext() ,前面介绍的 TaskManager 就是利用者两个方法对协程进行了管理,只有当MoveNext()返回 true时才可以访问 Current,否则会报错。迭代器方法运行到 yield return 语句时,会返回一个expression表达式并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。

        Unity在每帧做的工作就是:调用 协程(迭代器)MoveNext() 方法,如果返回 true ,就从当前位置继续往下执行。

 

过设置MonoBehaviour脚本的enabled对协程是没有影响的,但如果 gameObject.SetActive(false) 则已经启动的协程则完全停止了,即使在Inspector把gameObject 激活还是没有继续执行。也就说协程虽然是在MonoBehvaviour启动的(StartCoroutine)但是协程函数的地位完全是跟MonoBehaviour是一个层次的,不受MonoBehaviour的状态影响,但跟MonoBehaviour脚本一样受gameObject 控制,也应该是和MonoBehaviour脚本一样每帧“轮询” yield 的条件是否满足

### Unity 中与协程相关的常用方法 #### 协程启动 在 Unity 中,`StartCoroutine()` 方法用于启动一个新的协程。此函数接受一个 `IEnumerator` 类型的方法作为参数并返回一个 `Coroutine` 对象,该对象可以用来停止这个特定的协程。 ```csharp // 启动名为 MyCoroutine 的协程,并获取其引用以便后续控制 Coroutine myCoroutineInstance = StartCoroutine(MyCoroutine()); ``` #### 协程暂停 为了使协程能够等待一段时间再继续执行,通常会在协程内部调用 `yield return new WaitForSeconds(float seconds)` 来实现延迟效果[^2]。 ```csharp private IEnumerator MyCoroutine() { Debug.Log("Starting coroutine..."); yield return new WaitForSeconds(2f); Debug.Log("Continuing after delay."); } ``` #### 终止单个协程 当不再需要某个已经启动的协程时,可以通过传递之前通过 `StartCoroutine()` 获取到的对象给 `StopCoroutine(Coroutine routine)` 函数来终止它。 ```csharp if (myCoroutineInstance != null) { StopCoroutine(myCoroutineInstance); } ``` #### 终止所有协程 如果想要一次性结束当前脚本实例中的全部活动着的协程,则可以直接调用 `StopAllCoroutines()` 而无需指定具体哪一个要被停止。 ```csharp void OnDestroy() { StopAllCoroutines(); } ``` #### 利用事件触发器管理协程状态变化 除了基本的操作外,在实际开发过程中还可以结合 Unity 提供的各种组件特性(比如按钮点击、碰撞检测等),灵活地开启或关闭相应的协程逻辑处理流程,从而更好地满足游戏设计需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值