可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've always struggled with while loops because they barely ever work for me. They always cause my Unity3D application to freeze, but in this instance I really need it to work:
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; } } }
Ideally, I want those if statements to run as the game runs. Right now it crashes the program and I know it's the while loop which is the problem because it freezes anytime I uncomment it out.
回答1:
Update()
is called every frame, so you should not use a while
loop in it except in exceptional circumstances. This is because the game screen freezes until the loop is exited.
Further reading: https://docs.unity3d.com/Manual/ExecutionOrder.html
Instead, either use a coroutine as @Programmer has done, or use an if/switch statement instead, with a boolean check.
i.e.
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 } } }
回答2:
If you want to use a variable to control a while
loop and wait in that while
loop then do it in a coroutine function and yield
after each wait. If you don't yield, it will wait too much and Unity will freeze. On mobile devices like iOS, it would crash.
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; } }