LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
Unity-协程
Zeiod 2022-03-20

1.协程概念

2.协程函数的定义

3.协程函数的使用

4.协程函数的停止


1.协程概念

            协程就是“协同程序”,并不是多线程(虽然在使用上与多线程有一定相似地方,但本质上不是一个东西)

            既然叫协同,所以还有一个主程序,那么这个主程序其实就是我们目前学习到的各种生命周期函数(一个游戏物体产生有Start,Update,OnDestory一些生命周期函数,这个协同是在生命周期外的存在)

            为什么需要协程?

            主程序已经在执行某个任务,希望“同时运行”其他逻辑,这里的同时,并不是多线程意义上的同时,只是感官上是同时

2.定义协程函数

            public IEnumerator Demo()    //IEnumerator 协程特定返回值类型

            {

                Debug.Log("先做一些事情");

                yield return new WaitForSecond(1.0f);    //等待1秒钟

                Debug.Log("后做一些事情");    //这里正常执行,协程不会因为前面返回则不执行后面的代码。协程函数必须有返回值,但可以不走到那,比如if(2<1)yield return new WaitForSeconds(5.0f);

               yield return null;    //下一帧继续执行

               Debug.Log("最后做一些事情");

            }

这么写会立刻按顺序打印出"abc123"    "1.0s"


一些英语翻译:使用百度翻译

                IEnumerator    迭代器;枚举器;列举器;接口

                yield    提供;让步;

                普通函数里不能用yield,迭代器(协程)函数不能用return。

                break;和yield break;一个效果,都中断循环。

                不过yield break是中断整个协程。

                break只是跳出while。

                yield return可以返回另一个协程。比如:yield return Demo2();

通过这样来调用另一个协程。不过这样会跳出当前协程。

3.使用协程函数

            Coroutine    StartCoroutine(Demo("这是参数"))    

            Coroutine是返回值类型。翻译为:协同程序。

            执行一个协程,参数直接调用协程方法即可。可以用一个变量接受返回值用于后续停止该协程

            我们在生命周期函数中调用协程,但是协程的运行顺序和主程序无关,可以理解成开了一个分支专门运行这个协程,如果我们打开了多个协程,这些协助之间也无关

            例1:两种执行协程方法

                    void Start()

                    {

                        StartCoroutine("Demo"); //执行协程,无法有参数

                        StartCoroutine(Demo());//执行协程,可以有参数。主要用这种方法

                    }

            例2:每隔0.1秒旋转一次       

                    void Start()

                    {

                        StartCoroutine(Demo());

                    }

                    public IEnumerator Demo()

                    {

                        while(true)

                        {

                            yield return new WairForSeconds(0.1f);//暂停0.1秒,协程yield return不结束函数。

                            transform.Rotate(new Vector3(5,0,0));

                        }

                    }

                例3:

                    

效果是先打印“1.0s”,过5秒再打印"abc123"。如果直接写Demo();调用协程没有效果。

                    例4:

break;和yield break;一个效果,都中断循环。

不过yield break是中断整个协程。

break只是跳出while。

                例5:yield return另一个协程函数来执行它

                例6:位移一下后,中断自己执行Demo2()

yield return可以返回另一个协程。比如:yield return Demo2();

通过这样来调用另一个协程Demo1。不过这样会跳出当前协程Demo2。

4.停止协程函数

            协程如果运行到最后一行,意味着停止,但是如果我们想主动停止。

            StopAllCoroutines():结束全部协程

            StopCoroutines:结束某个协助程序:有三种用法如下:

                                StopCoroutine(IEnumerator routine);和调用协程一样使用,但是如果协程有参数不要使用这个

                                StopCoroutine(Coroutine routine):参数填写协程变量

                                StopCoroutine(string methodName):参数填写协程方法的名         

while(true)会一直执行下去,要停止它,一个方法是加入一个终止条件,另一个办法是停止协程函数。

StopCoroutine(Demo())这种写法会结束所有Demo同名协程。

而用返回值可以关掉指定的协程,因为开始协程函数会返回一个Coroutine类型的返回值。

Coroutine    StartCoroutine(Demo("这是参数"));

比如Coroutine cor1 = Demo();StopCoroutine(cor1);可关掉Demo这个协程。

而且由他调用的协程也会在执行所有代码后关闭。

                例1:协同程序Demo3将在5s后结束所有协同程序

                   例2:5s后方块不再旋转,且在打印一遍“结束了”后不会再打印了。

                    例3:只关掉了一个Demo,另一个还在正常工作:旋转方块、打印消息


推荐文章
评论(0)
分享到
转载我的主页