zoukankan      html  css  js  c++  java
  • Unity3D协程yield的理解

      Unity3D的协程概括地将就是:对于一段程序,你可以加上yield标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码。协程的作用:①延迟一段时间执行代码。②等某个操作完成之后再执行之后的操作。

      总结起来就是一句话:控制一段代码在特定的时机执行。

      Unity3D协程的核心在于“yield return"命令,这句代码的意义是马上停止当前函数,然后在下一帧中从这里重新开始。举个例子:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CoroutineCountdown : MonoBehaviour
    {
        public float floattimer;
        public float timer;
    
        void Start()
        {
            StartCoroutine(Countdown());
        }
    
        IEnumerator Countdown()
        {
            int seconds = 0;
            while (true)
            {
                //timer累加到1时,相当于运行了1秒后,会timer大于1,不会执行yield return 0,而结束循环
                //接着执行second++;second通过log对用户可见,随着程序执行,每过1秒输出累加时间值1,2,3。。。
                for (float timer = 0; timer < 1;)
                {
                    yield return 0;
                    timer += Time.deltaTime;
                }
                seconds++;
                Debug.Log(seconds + " seconds have passed since the Coroutine started.");
            }
        }
    }

      在timer满足循环条件,即timer小于1时,会执行yield return 0,这时候会停止countdown函数,然后在下一帧中重新从yield处开始执行;所以在进入下一帧时会先在运行一次yield return 0语句,然后是timer+=Time.deltaTime,当timer大于1时,这时候不满足循环的判断条件,这时候会结束循环。接着运行下一行代码:second++,对Second累加1,并输出Log信息。

      在Console窗口中会输出log信息,可见Second每秒累加1次。其实每次输出log信息时,

      

      另外注意,结束一个协程需要使用协程函数的字符串形式:StopCoroutine("Countdown");

      协程是 Unity 3D的一种官方的加载方式,好处是能让代码看起来更“同步”(sync)一些。协程不是线程,也不是异步执行(async)的。协程和 MonoBehaviour 的 Update函数一样也是在MainThread中执行的。使用协程你不用考虑同步和锁的问题。资源在 yield 返回后即可使用,代码比回调的方式容易组织。

  • 相关阅读:
    学习 TList 类的实现[8]
    System.SetString 获取字符串
    System.Odd 判断一个整数是不是奇数
    问与答[2008331]
    System.Val 将字符串转换为数字
    事件自调用 回复 maxcool 的问题
    JS操作select相关方法:新增 修改 删除 选中 清空 判断存在 等
    自由人生 从容生活
    [引]智能设备开发演练:创建用于设备的 Windows 窗体应用程序
    gentle做的分页控件
  • 原文地址:https://www.cnblogs.com/zeppelin5/p/10040283.html
Copyright © 2011-2022 走看看