标签:
协同程序这个好处大大的,用过的人都说好
转载出处:http://wg2009perfect.blog.163.com/blog/static/127997663201211111222126/
一。什么是协同程序
协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。
二。协同程序的开启与终止
在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中,这样我们在编程时就可以方便的调用指定脚本 中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重 名。
/// <summary> ///生成图片 /// </summary> public void CreateSprite() { StopCoroutine(DestroySprite(buttongame)); if(buttontype == ButtonType.Expand) { int pos = Random.Range(0,materials.Length); Vector3 position = new Vector3(Random.Range(-5,5f),Random.Range(0.5f,0.8f),Random.Range(-3,3)); Quaternion rotation = Quaternion.AngleAxis(90,Vector3.right); GameObject go = ObjectPool.Instance.MyInstantiate(Photo,position,rotation); go.transform.parent = Container.transform; go.transform.localScale = new Vector3(0.5f,1,0.5f); go.renderer.material = materials[pos]; Container.GetComponent<Container3D>().Start(); StartCoroutine(DestroySprite(buttongame)); } } IEnumerator DestroySprite(GameObject go) { yield return new WaitForSeconds(5f); Destroy(go); }
自己写的脚本比较渣。CreateSprite();这个函数是UGUI Button的点击事件, 当点击的时候先把DestroySprite携程终止掉,然后实例化图片以后再继续开启携程,5秒后销毁这个Button。如果在5秒内再次触发按下这个Button后,程序会从新计算时间然后执行
另外Invoke这个也可以实现计时,不过Invoke他不能有参数。所以还是用协同吧。
标签:
原文地址:http://www.cnblogs.com/unitySPK/p/5070038.html