【发布时间】:2015-05-24 13:28:35
【问题描述】:
我正在构建一个由数千个星系组成的太空游戏。现在,有一个函数可以生成这数千个系统。生成大约需要 5-10 秒,我希望有一个简单的进度条来更新用户的进度。
经过一番搜索,我决定使用协程,但是有一个小问题:当我调用该函数生成星系统时,调用该函数的代码继续运行,报告零星(因为他们没有'尚未生成)。
我觉得协程不是我的答案。基本上,我只是在寻找一种模拟 Application.DoEvents 来更新 GUI 的方法。
这是我的代码示例:
// Start generating thousands of systems
StartCoroutine(GalacticMap.GenerateRandomGalaxy());
// after the universe is generated...
Game.myGalaxy.StarSystems = GalacticMap.myGalaxy.StarSystems;
// report back the number of systems
print(String.Format("Generated {0} systems", Game.myGalaxy.StarSystems.Count));
在GalacticMap.GenerateRandomGalaxy() 中,我像yield return new WaitForSeconds(0.1f); 一样让步,但是,效果不是我想要的:执行直接到print 语句,而生成仍在进行中。
那么我该怎么做呢?
编辑 1:
我已经编写了一个示例代码来说明我的问题。
调用者代码:
Debug.Log ("Start generating");
StartCoroutine(GenerateMeGalaxy());
Debug.Log ("Finish generating");
我调用的代码:
public static IEnumerator GenerateMeGalaxy ()
{
Debug.Log ("GenerateMeGalaxy start");
int numberOfStars = 1000;
for (int i=0;i<=numberOfStars;i++)
{
// generate galaxy
// display progress bar on screen
Debug.Monitor(String.Format("{0}% completed", ((i*100)/numberOfStars)),2);
yield return new WaitForSeconds(0.001f);
}
Debug.Log ("GenerateMeGalaxy end");
}
在上面的代码中,Debug.Log 在屏幕上的新行上显示字符串,以便您可以读取以前记录的任何字符串。这是为了调试代码执行。 Debug.Monitor 在屏幕上有一个固定位置,会覆盖之前的字符串。这是我显示进度百分比的地方。运行这段代码后我看到的是:
Start generating
GenerateMeGalaxy start
Finish generating
GenerateMeGalaxy end
我想看到的是:
Start generating
GenerateMeGalaxy start
GenerateMeGalaxy end
Finish generating
...而且进度更新正在两者之间进行:
GenerateMeGalaxy start
Finish generating
【问题讨论】:
-
不是很清楚你的问题是什么。可以细化吗?
-
高级:我正在调用一个函数来生成大量的星系统。使用 1000 颗星执行该功能大约需要 5-10 秒。我有一个进度显示完成了多少生成通知用户。问题是,当我调用该函数时,我看不到进度像 5%...10%...15%... 等变化。屏幕上的所有内容都会冻结 510 秒,然后我只看到 100 % 函数完成时。在VB6中,这个问题会很容易解决......在更新进度条后放置DoEvents。 Unity 没有这个命令。
标签: loops unity3d progress-bar coroutine