找回密码
 立即注册
楼主: genice26

[常见问题] 关于unity3d中的协程

[复制链接]
发表于 2015-2-2 16:44 | 显示全部楼层 |阅读模式

蛮牛教育上的卡牌视频,讲到协程,我去网上找了一些关于协程的观点,给大家分享一下


一。什么是协同程序

       协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

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

       在unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。

       在unity3d中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。

        在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。

        还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启;如是将协同程序所在脚本的enabled设置为false则不会生效。这是因为协同程序被开启后作为一个线程在运行,而MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线程。然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重名。




发表于 2015-2-3 11:14 | 显示全部楼层
我来踩一脚吧
发表于 2017-4-2 12:19 | 显示全部楼层
好帖就是要顶
发表于 2017-4-2 12:28 | 显示全部楼层
顶顶多好
发表于 2017-4-2 12:38 | 显示全部楼层
很好哦
发表于 2017-4-2 12:23 | 显示全部楼层
不错不错
发表于 2017-4-2 12:48 | 显示全部楼层
LZ真是人才
发表于 2017-4-15 14:34 | 显示全部楼层
楼主是超人
发表于 2017-4-15 14:32 | 显示全部楼层
真心顶
发表于 2017-4-15 14:43 | 显示全部楼层
难得一见的好帖
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-11 19:44 , Processed in 0.093787 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表