我一直在与while循环斗争,因为他们几乎没有为我工作。它们总是导致我的Unity3D应用程序冻结,但在这种情况下我真的需要它才能工作:
bool gameOver = false;
bool spawned = false;
float timer = 4f;
void Update ()
{
while (!gameOver)
{
if (!spawned)
{
//Do something
}
else if (timer >= 2.0f)
{
//Do something else
}
else
{
timer += Time.deltaTime;
}
}
}
理想情况下,我希望这些if语句在游戏运行时运行。现在它崩溃了程序,我知道它是while循环,这是问题,因为它随时冻结我冻结。
答案 0 :(得分:2)
如果要使用变量控制while
循环并在while
循环中等待,则在协程函数中执行此操作,并在每次等待后执行yield
。如果你不屈服,它会等待太多,Unity会冻结。在像iOS这样的移动设备上,它会崩溃。
void Start()
{
StartCoroutine(sequenceCode());
}
IEnumerator sequenceCode()
{
while (!gameOver)
{
if (!spawned)
{
//Do something
}
else if (timer >= 2.0f)
{
//Do something else
}
else
{
timer += Time.deltaTime;
}
//Wait for a frame to give Unity and other scripts chance to run
yield return null;
}
}
答案 1 :(得分:2)
Update()
被称为每一帧,因此除非在特殊情况下,否则不应在其中使用while
循环。这是因为游戏屏幕会冻结,直到退出循环。
进一步阅读:https://docs.unity3d.com/Manual/ExecutionOrder.html
相反,要么像@Programmer那样使用协程,要么使用if / switch语句代替布尔检查。
即
bool gameOverActionDone = false;
void Update ()
{
if (!gameOver && !gameOverActionDone)
{
if (!spawned)
{
//Do something
gameOverActionDone = true;
}
else if (timer >= 2.0f)
{
//Do something else
gameOverActionDone = true;
}
else
{
timer += Time.deltaTime; //either keep this here, or move it out if the if condition entirely
}
}
}