Unity3D协程介绍 以及 使用
Unity协程这块一直有些不懂,网上找到这个博文介绍的挺好的,引荐过来了。
原文点击:https://blog.csdn.net/huang9012/article/details/38492937?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
一、协程讲解
以一段代码为例进行分析:
using UnityEngine; using System.Collections; public class CoroutineCountdown : MonoBehaviour { void Start() { StartCoroutine(Countdown()); //在start中开启协程,并执行定义的方法 }
//创建一个带有协程的方法,要有 IEnumerator 进行修饰 IEnumerator Countdown() { for(floattimer = 3; timer >= 0; timer -= Time.deltaTime) //循环 Yield return 0; //打断循环,下一帧再从这里接着执行 Debug.Log("This message appears after 3 seconds!"); } }
原本Countdown方法是在Start方法中被执行,则意味着在脚本执行的第一帧时,Countdown方法就应该全部执行完毕(即在一帧内,方法内部的循环也执行完毕),但是在执行第一次循环,执行到Yield return 0时,这句话等于告诉系统,当前的这个方法(Yield return 0所在的这个方法)停在这里别往下执行了,等到下一帧的时候再从这里接着往下执行。换句话说就是,方法会执行完,循环也会执行完,只不过Yield把这个Countdown方法内部的循环给打断了,让这个循环不是在一帧内执行完毕,而是分为每帧循环一次,直至循环完毕。【这个可用于一些比较耗时的事情,比如加载资源,一次全部加载资源的话会卡,就可以使用这个yield方法使加载资源分为每帧执行一次这样就不会太卡了】
注意:用0或者null来yield的意思是告诉协程等待下一帧,直到继续执行为止。同样可以yield其他协程;
二、补充知识
1、开始和终止协程
(1)开始协程:通过 StartCoroutine()方法来开始一个协程,就像这样: StartCoroutine(Countdown());
(2)终止协程:通过StopAllCoroutines()方法来实现当前对象中所有协程的终止;
注:这只会终止在调用该方法的对象中(应该是指调用这个方法的类吧)开始的协程,对于其他的MonoBehavior类中运行的协程不起作用
2、停止某一协程
想要终止某一个特定的协程,那么必须在开始协程的时候将它的方法名作为字符串
//通过字符串来开始某一协程 StartCoroutine("FirstTimer"); StartCoroutine("SecondTimer");
//通过字符串来终止某一协程 //You can stop it anytime by name! StopCoroutine("FirstTimer");