关于unity3d中的协程

2015年03月14日 10:29 0 点赞 0 评论 更新于 2025-11-21 17:00

今天我整理了一些关于 Unity3D 中协程的观点,在此分享给大家。

一、什么是协同程序

协同程序指的是在主程序运行时,同时开启另一段逻辑处理,以协同当前程序的执行。不过需要注意的是,开启协同程序并不等同于开启一个线程。线程是由操作系统进行管理和调度的,而协程是 Unity 提供的一种特殊机制,它是在单线程内实现的,利用了迭代器的特性,在代码执行过程中可以暂停和恢复执行,从而实现类似多线程并发执行的效果,但实际上并没有真正创建新的线程。

二、协同程序的开启与终止

1. 开启协同程序

在 Unity 中,使用 MonoBehaviour.StartCoroutine 方法即可开启一个协同程序。这意味着该方法必须在 MonoBehaviour 或继承于 MonoBehaviour 的类中调用。具体有以下两种调用方式:

  • StartCoroutine(string methodName):使用字符串作为参数可以开启一个协程,并且可以在线程结束前终止该协程。不过这种方式在开启协程时最多只能传递一个参数,而且性能消耗会相对大一点。因为 Unity 需要通过反射来查找对应的方法。
  • StartCoroutine(IEnumerator routine):使用 IEnumerator 作为参数也能开启一个协程,但这种方式只能等待协程自然结束,不能通过常规方式随时终止(除非使用 StopAllCoroutines() 方法)。不过它在传递参数方面没有限制,可以根据需要传递多个参数。

2. 终止协同程序

  • StopCoroutine(string methodName):用于终止一个指定名称的协同程序。需要注意的是,该方法只能终止该 MonoBehaviour 中的协同程序。
  • StopAllCoroutines():用于终止该 MonoBehaviour 中所有可以终止的协同程序。同样,它的作用范围仅限于当前的 MonoBehaviour

3. 其他终止方式

还有一种特殊的终止协同程序的方法,即将协同程序所在 GameObjectactive 属性设置为 false。当再次将 active 设置为 true 时,协同程序并不会再次开启。而如果将协同程序所在脚本的 enabled 设置为 false,则不会生效。这是因为协程被开启后虽然在单线程内模拟并发执行,但它与 MonoBehaviour 是相对独立的模块,除非在代码中有明确的调用关系,它们共同作用于同一个对象。只有当对象不可见(即 GameObjectactive 属性为 false)时,才能同时暂停这两个模块的执行。

将协同程序的调用放在 MonoBehaviour 中,是为了方便管理额外开启的协程。特别是在多人开发中,如果只根据方法名来判断线程,很容易出现重名和管理混乱的问题。这样的设计保证了对象、脚本的条理化管理,避免了潜在的错误。

作者信息

boke

boke

共发布了 3994 篇文章