Ich habe eine Coroutine, die eine Variable in meiner Benutzeroberfläche reibungslos ändert, aber wenn ich das Spiel pausiere, pausiert auch die Coroutine. Wie kann ich das beheben?
Code:
using UnityEngine;
using System.Collections;
public class HUDController : MonoBehaviour {
public void PauseGame() {
FreezeTime();
StartCoroutine(ShowPauseMenu());
}
private void FreezeTime() {
Time.timeScale = 0;
}
private IEnumerator ShowPauseMenu() {
var pauseMenuCanvasGroup = GameObject.FindWithTag("PauseMenu").GetComponent<CanvasGroup>();
var alphaValue = 1f;
var velocity = 0f;
var time = 0.15f;
while (!Mathf.Approximately(pauseMenuCanvasGroup.alpha, alphaValue)) {
pauseMenuCanvasGroup.alpha = Mathf.SmoothDamp(pauseMenuCanvasGroup.alpha, alphaValue, ref velocity, time);
yield return null;
}
pauseMenuCanvasGroup.alpha = 1; // Since float is not accurate, manually set the alpha to 1
pauseMenuCanvasGroup.interactable = true;
}
}
yield return null
odernew WaitForEndOfFrame()
weiter summen, wennTime.timeScale = 0
- es ist nuryield return new WaitForSeconds(delay)
diese Pause. Können Sie bestätigen, welche Version von Unity Sie ausführen?Antworten:
Dies ist sicher, weil geschah
Mathf.SmoothDamp
AnwendungenTime.deltaTime
in Standardberechnung. Wenn SieTime.timeScale = 0
dann einstellen,Mathf.SmoothDamp
wird nicht wiederholt der erwartete Wert, sondern nur der erste Wert angegeben.Sie können dies weiter überprüfen, indem Sie den Alpha-Wert auf die Konsole drucken und ihn in Ihrer
while
Schleife drucken, damit Sie ihn durch die unbegrenzten Protokolle mit demselben Wert bestätigen können.Hier ist die Dokumentation zu Mathf.SmoothDamp .
Sie können dies beheben, indem Sie Ihre eigene deltaTime übergeben, um zu verhindern, dass die Standardeinstellung verwendet wird
Time.deltaTime
. Fügen Sie am Ende des Aufrufs einfach einen weiteren Parameter hinzu:Sie können eine Funktion verwenden, die die verstrichene Echtzeit anstelle einer Konstanten misst, wenn Ihre Rendering-Framerate variabel ist.
quelle
Ich hatte dieses Problem und die Situation war so, und ich habe es gelöst . Der Benutzer drückt die Pause-Taste, dann gehen einige Objekte aus (diese Objekte haben Couroutine (s)). DAS IST DAS PROBLEM. Ich darf diese Spielobjekte nicht ausschalten . Die Coroutinen funktionieren einwandfrei, während das Spielobjekt eingeschaltet ist und wenn Sie sie ausschalten, wird alles durcheinander sein.
quelle