unity执行顺序以及unity协程的使用

unity执行顺序以及unity协程的使用_第1张图片


这个是官方的文档,下面结合协程简单的测试下


using UnityEngine;
using System.Collections;

public class MyYield : MonoBehaviour {

    // Use this for initialization
    bool isCango = true;
	void Start () {
        // StartCoroutine(GoandWait());
        StartCoroutine(testFrame());
	}
    IEnumerator testFrame() {
         yield return new WaitForEndOfFrame();
        // yield return null;
        //yield return new WaitForFixedUpdate();
        Debug.LogError("this is update over");
    }
    IEnumerator GoandWait() {
        while (true) {
            yield return new WaitForSeconds(3f);
           

            float startTime = Time.time;
            float endTime = startTime;
            while(endTime - startTime < 2f)
            {
                transform.Translate(transform.forward * Time.deltaTime);
                yield return new WaitForEndOfFrame() ;// 如果没有这句会有什么现象?//unity进入此处while ,无法退出等时间到了,会让cube,瞬移到2s后的距离,unity运行是按照帧的顺序执行,跟程序语言不同
                endTime = Time.realtimeSinceStartup;
            }
        }
    }

	// Update is called once per frame
	void Update () {
        Debug.Log("this is first update");
	}
}






暂时忽略另一个协程 GoandWait。  通过比较2个debug的顺序就能知道执行顺序了

效果如图

unity执行顺序以及unity协程的使用_第2张图片


yield return null 是在update后面执行的。

第一帧先执行update输出log一次,然后执行yield return null 等待一帧,

第二帧在输出update的log信息一次, 然后协程里面的yield return null条件满足了,然后输出 logError信息


unity执行顺序以及unity协程的使用_第3张图片


waitforFixedUpdata 在updata之前执行

第一帧 先执行waitforFixedUpdate 输出LogError信息,后执行update执行输出log信息


总结:

unity执行顺序以及unity协程的使用_第4张图片



协程使用:

物体前进2s后,等待3s,后继续前进2s 如此循环

另一个协程 GoandWait

协程使用时间控制2s内移动,熟悉这样的写法就可以了

另一个方法在upde里面,似乎比较麻烦 欢迎新方法


using UnityEngine;
using System.Collections;

public class MyUpdate : MonoBehaviour {
    float time = 3f;
    bool canMove = false;
    bool canStay = true;
    float time_move = 2f;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (canStay)
        {
            time -= Time.deltaTime;
            if (time < 0)
            {
                time = 3f;
                canMove = true;
                canStay = false;
            }
        }
        if (canMove) {
            time_move -= Time.deltaTime;
            if (time_move < 0)
            {
                time_move = 2f;
                canMove = false;
                canStay = true;
            }
            transform.Translate(Vector3.forward * Time.deltaTime);

        }
	}
}




 
  


你可能感兴趣的:(unity执行顺序以及unity协程的使用)