Unity异步和/或协程实现?

时间:2017-07-27 17:23:02

标签: c# asynchronous unity3d coroutine

参考: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仍然暂时挂起。模型将加载,同时加载文本。

1 个答案:

答案 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。