Unity3d 協程的注意問題(新手須注意,老手須加勉)


關於unity3d的協程,非常的好用,比如等待幾秒執行,等待下一幀執行等!

但是也有潛在的問題:

1.協程是單線程的,在主線程中完成

2.如果發現yield, 那么這一幀會結束,那么等下一幀調用此腳本的時候繼續執行!

如果同一個協程方法被兩個方法在相對短的時間內都進行調用,那么就會出現邏輯上的錯誤!這個時候需要用鎖來鎖定!

我舉例如下:

using UnityEngine;
using System.Collections;

public class YieldScpipt : MonoBehaviour {

    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
    }

    public void RunContinue()
    {
        StartCoroutine(run());
    }

    IEnumerator run()
    {
        print("1");
        //yield return 0;
        print("2");
        //yield return 0;
        print("3");
        yield return 0;
    }
}

在另一個類中用Test方法進行調用

public class Test : MonoBehaviour {

    public YieldScpipt ys;
    // Use this for initialization
    void Start () {
     for(int i=0;i<3;i++)
     {
         ys.RunContinue();
     }
    }
    // Update is called once per frame
    void Update () {
    }
}

那么會打印如下:1,2,3,1,2,3.。。。預期的順序

如果把注釋去掉

  IEnumerator run()
    {
        print("1");
        yield return 0;
        print("2");
        yield return 0;
        print("3");
        yield return 0;
    }
那么打印的順序就不能保證了,這就是我遇到的問題!

當然,我不是用for循環這樣引起的,我是不經意間寫錯了邏輯,導致在很短的時間內,這個方法被兩次或者多次調用,導致了邏輯錯誤!

有什么問題請指出!歡迎與廣州老龍聯系!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM