2016-09-27 61 views
0

每當使用Update()方法如下:調試日誌消息()的代碼大塊,僅在此之後完成時,使用更新的執行之前

void Update() { 
    if (Input.GetMouseButtonDown(0) && useRandomSeed) { 
     Debug.Log("Generating New Map..."); 
     GenerateMap(); 
     Debug.Log("New Map Generated!"); 
    } 
} 

控制檯的輸出將推動(可視地)同時輸出第一條消息和第二條消息。而GenerateMap()則先執行。 GenerateMap()是一種需要一段時間才返回的方法。

什麼預期:打印

  • 首先調試消息。
  • 代碼被執行。
  • 打印第二條調試消息。

發生了什麼事:執行

  • 代碼。
  • 打印第一個和第二個調試消息(按順序)。

我試着這樣做:

void Update() { 
    if (Input.GetMouseButtonDown(0) && useRandomSeed && !mapGenPending) { 
     Debug.Log("Generating New Map..."); 
     mapGenPending = true; 
    } else if (mapGenPending) { 
     GenerateMap(); 
     Debug.Log("New Map Generated!"); 
     mapGenPending = false; 
    } 
} 

但是,這仍然導致了第二種情況。我認爲Unity可能不關心Update()每個週期內的某些代碼段的順序,但即使是2個週期也不足以將消息按順序打印在控制檯中。

最終,如何防止這種情況發生,以獲得預期的訂單?

+0

這似乎很奇怪。我從來沒有面對過這個。你還可以添加你在問題中得到的輸出嗎? –

回答

0

嘗試與程序協同程序,例如:

public IEnumerator LoadMap(){ 
     Debug.Log("Generating New Map..."); 
     GenerateMap();    
     while(generated==false){ 
      yield return new WaitForSeconds(0.1f); 
     } 
     Debug.Log("New Map Generated!"); 
} 

在更新:

void Update(){ 
     if (Input.GetMouseButtonDown(0)){ 
       StartCoroutine(LoadMap()); 
     } 
} 

在你的類:

private bool generated = false; 

在您GenerateMap方法:

public void GenerateMap(){ 
// 
// 
// 
// 
    generated=true; 
} 

這樣,New Map Generated!消息將在生成的從false更改爲true時顯示。

+0

這不起作用,出於某種原因,只有在地圖完成生成後纔會顯示第一條調試消息。因此在協程內部和外部發生的任何調試日誌消息都將在(大致)同時輸出,而不是在進程之前輸出,而在進程之後輸出。 – AgentM

+0

你能更新其中的協程代碼嗎?,我認爲你誤解了沉思。 –

相關問題