2017-07-27 223 views
0

參考:How to execute async task in Unity3D?Unity異步和/或協程實現?

我有一個腳本動態加載按鈕點擊高LOD模型。不幸的是,Unity會滯後或丟幀。實際上我不確定哪一個,但似乎是凍結,直到大型模型加載。這不是非常用戶友好的。在理想的世界中,我可以在加載模型時向用戶顯示「加載...」文本消息。

從我發現,異步方法是實現這一目標的最好方法,但我似乎無法實現異步方法。我在其他地方讀到,協程是執行異步任務的乾淨方式。我想...

IEnumerator txtTask() 
{ 
    yield return new WaitForSeconds(0); 
    LoadingTxt.GetComponent<UnityEngine.UI.Text>().enabled = true; 
} 

,然後調用這個協程在模型加載功能的開始,

StartCoroutine(txtTask()); 

但是,這並不工作,團結還是暫時掛起。該模型將同時載入文本。

+0

您使用什麼代碼加載LOD模型?請張貼,因爲決定什麼是最好解決這個問題很重要。 – Programmer

+0

只發布負責加載不同型號的相關部件。 – Programmer

+0

您的問題似乎是關於如何改善您所遇到的掛起的用戶體驗,顯示加載模型的代碼將讓我們向您展示如何異步加載模型以防止掛起。您只是在試圖治療症狀(文本沒有出現)而不是治療問題(從對象加載中掛起)時將焦點集中在錯誤的位置。同樣,即使您想保持掛起狀態並使文本正常工作,您也需要向我們展示更多包含'StartCoroutine(txtTask())'行的代碼。你拖延錯誤,你需要延遲加載而不是文本。 –

回答

1

協程仍然只使用一個線程來處理,所以當你在你的方法中產生的時候,你所做的只是讓文本等待0秒來顯示,但它仍然使用UI線程(它正在被你的加載鎖定代碼)來顯示它。

您需要做的是延遲一幀的加載代碼,以便UI可以更新,然後讓慢速運行。

private UnityEngine.UI.Text textComponent; 

void Start() 
{ 
    //You should do your GetCompoent calls once in Start() and keep the references. 
    textComponent = LoadingTxt.GetComponent<UnityEngine.UI.Text>() 
} 

IEnumerator LoadData() 
{ 
    textComponent.enabled = true; //Show the text 
    yield return 0; //yielding 0 causes it to wait for 1 frame. This lets the text get drawn. 
    ModelLoadFunc(); //Function that loads the models, hang happens here 
    textComponent.enabled = false; //Hide the text 
} 

你再調用StartCoroutine(LoadData());啓動corutine關在您的按鈕代碼。

+0

是的,謝謝! – jtth