欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频,我们致力于打造业内unity3d培训、学习第一品牌。
什么是协同程序
协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。
协同程序的开启与终止
在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。
在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。
在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。
例:
这个例子将执行Do,但是do函数之后的print指令会立刻执行.
- <span style="font-size:18px;">Do ();
- Console.WriteLine("This is printed immediately");
- IEnumerator Do ()
- {
- Console.WriteLine("Do now");
- yield return new WaitForSeconds (2);
- Console.WriteLine("Do 2 seconds later");
- }
- <span style="font-size:18px;">// 启动协程
- yield return StartCoroutine("Do");
- Console.WriteLine("Also after 2 seconds");
- Console.WriteLine ("这个print将在Do协程执行完以后显示。");
- IEnumerator Do ()
- {
- Console.WriteLine("Do now");
- yield return new WaitForSeconds (2);
- Console.WriteLine("Do 2 seconds later");
- }
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine and MonoBehaviour.StartCoroutine 可以获得更多使用yield的信息.
yield return可以看做是一种特殊的return,会返回到父类继续执行,但是yield return后面的类型或方法会有一个执行条件,当条件满足时会回调包含yield的子函数,
- void Start () {
- print("Starting:" + Time.time);
- StartCoroutine(WaitAnPrint(2.0F));
- print("Before WaiAndPrint:" + Time.time);
- }
- IEnumerator WaitAndPrint(float waitTime)
- {
- yield return new WaitForSeconds(waitTime);
- print("WaitAndPrint:" + Time.time);
- }