• 奥东here......Unity中的协程


    参考文章地址:

     http://dsqiu.iteye.com/blog/2029701

            定义:

                                  A coroutine is a function that is executed partially and, presuming suitable conditions are met, will be resumed at some point in the future until its work is done.

                                  即协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。

    协程的作用一共有两点:

                             1  延时(等待)一段时间执行代码

                                    2  等某个操作完成之后再执行后面的代码

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

         执行的时机:

                                    Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足),但也有写特例

                                    

                                    

                                      

                        注意点:  

                                    1  协程不是线程,也不是异步执行的,协程和 MonoBehaviour 中的 Update函数一样也是在MainThread中执行的。所以使用协程你不用考虑同步和锁的问题

                     示例代码:

    public class TestCoroutine : MonoBehaviour
    {
    
         //Makesure Update() and LateUpdate() Log only once
        private bool isUpdateCall = false;
        private bool isLateUpdateCall = false;
        private  int num = 1;//展示各个log打印的顺序
        // Use this for initialization
        void Start()
        {
                Debug.Log("Start Call Begin  "+num++);// 1
                StartCoroutine(StartCoutine());
                Debug.Log("Start Call End  " + num++);//3
        }
        IEnumerator StartCoutine()
        {
    
            Debug.Log("This is Start Coroutine Call Before " + num++);//2
            yield return new WaitForSeconds(1f);
            //在执行上面语句的同时,num从2变成了11 这个时间断内有Update()方法和LateUpdate()方法在执行
            Debug.Log("This is Start Coroutine Call After " + num++);//11
    
        }
        // Update is called once per frame
        void Update()
        {
            if (!isUpdateCall)
            {
                Debug.Log("Update Call Begin " + num++);//4
                StartCoroutine(UpdateCoutine());
                Debug.Log("Update Call End " + num++);//6
                isUpdateCall = true;
            }
        }
        IEnumerator UpdateCoutine()
        {
            Debug.Log("This is Update Coroutine Call Before " + num++);//5
            //yield return new WaitForSeconds(1f);
            yield return null;
            Debug.Log("This is Update Coroutine Call After " + num++);//10
        }
        void LateUpdate()
        {
            if (!isLateUpdateCall)
            {
                Debug.Log("LateUpdate Call Begin " + num++);//7
                StartCoroutine(LateCoutine());
                Debug.Log("LateUpdate Call End " + num++);//9
                isLateUpdateCall = true;
            }
        }
        IEnumerator LateCoutine()
        {
            Debug.Log("This is Late Coroutine Call Before " + num++);//8
            yield return new WaitForSeconds(1f);
            Debug.Log("This is Late Coroutine Call After " + num++);//12
        }
    }
    

      

    Pre Tip:

    1   StartCoroutine()方法在执行的时候,对应绑定的物体上销毁的时候,不管StartCoroutine()方法执行到何处,都停止执行,这个时候就会出现问题

              解决办法: 物体(GameObject)本身只调用本身的StartCoroutine()方法,当别的物件A调用物件B的Coroutine()方法时,当关联的物件消失的时候,就会出现问题

  • 相关阅读:
    菜鸟版JAVA设计模式—从买房子看代理模式
    NTP工作机制及时间同步的方法
    Java工厂模式
    圣魔大战3(Castle Fantisia)艾伦希亚战记完美攻略
    对javabean的内省操作
    插入排序(insertion sort)
    中英文对照 —— 十二星座
    中英文对照 —— 十二星座
    数学归纳法的相关证明
    数学归纳法的相关证明
  • 原文地址:https://www.cnblogs.com/nauy/p/3819957.html
Copyright © 2020-2023  润新知