游戏开发者社区

[随便聊聊] 关于unity3d中的协程

查看: 6204|回复: 2

Rank: 5Rank: 5

威望
72 点
义气
0 点
发表于 2015-2-2 17:23:35 |显示全部楼层

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


一。什么是协同程序

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

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

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

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

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

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




举报

头像被屏蔽

807465789qqcom

Rank: 11Rank: 11Rank: 11Rank: 11Rank: 11

威望
0 点
义气
0 点
发表于 2016-1-27 18:28:35
提示: 作者被禁止或删除 内容自动屏蔽

举报

Rank: 1

威望
0 点
义气
0 点
发表于 2017-2-11 18:44:23
说的太好了!感谢分享。

举报

您需要登录后才可以回帖 登录 | 注册

关闭

江湖传闻

手机版|9RIA.com ( 京ICP备11007422号-2 

GMT+8, 2017-3-31 06:38 , Processed in 0.097824 second(s), 16 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部