参考:How to execute async task in Unity3D?
我有一个脚本在点击按钮时动态加载高LOD模型。不幸的是Unity会滞后或丢帧。实际上我不知道哪个,但它似乎被冻结,直到加载大型模型。这不是非常用户友好。在理想的世界中,我可以在加载模型时向用户显示“正在加载...”文本消息。
根据我的发现,异步方法是实现此目的的最佳方法,但我似乎无法实现异步方法。我在其他地方读到,协同程序是执行异步任务的干净方法。我试过......
IEnumerator txtTask()
{
yield return new WaitForSeconds(0);
LoadingTxt.GetComponent<UnityEngine.UI.Text>().enabled = true;
}
然后在模型加载函数的开头调用此协程,
StartCoroutine(txtTask());
但这不起作用,Unity仍然暂时挂起。模型将加载,同时加载文本。
答案 0 :(得分:1)
Coroutines仍然只使用一个线程进行处理,所以当你在你的方法中产生时,你所做的就是让文本等待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。