關於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循環這樣引起的,我是不經意間寫錯了邏輯,導致在很短的時間內,這個方法被兩次或者多次調用,導致了邏輯錯誤!
有什么問題請指出!歡迎與廣州老龍聯系!