今天在程序逻辑的时候遇到一个小问题,就是在Awake开启了一个协程,发现协程怎么都无法往下执行。
void Awake ()
{
StartCoroutine (DelayCheckState ());
}
IEnumerator DelayCheckState(){
Debug.Log ("AAAA");
yield return null;
Debug.Log ("BBB");
CheckState ();
}
后来发现原来是因为其他地方将这个GameObject隐藏了再打开,以为是像Invoke一样,不显示的时候暂停,显示了再继续一样。
后来查到资料才知道:
II:StartCoroutine(IEnumerator routinue);
只能等待线程的终止而不能随时终止
销毁:StopAllStoroutines(),
协同程序所在的gameObject 的 active属性设置为false,再次设置active为true,协同程序将不会再次开启。
如果将协同程序所在的脚本的enable设置为false则不会消失。这是因为协同程序被开启后作为一个线程在运行,
而MonoBehaviour也是一个线程,他们成为互不干扰的的模块。他们公用一个对象,只有在这个对象不可见才能同时终止这两个线程。然而为了
管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样在编程时就可以方便的调用指定的脚本中的协同程序,而不是
无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计是为了保证对象,脚本的条件管理,并防止重名。
有点略坑。开此贴警示下。