Come rendere il copione aspettare / dormire in modo semplice nell’unità

Come si può mettere tra TextUI.text = .... una funzione sleep, per attendere 3 secondi tra ogni frase?

 public Text GuessUI; public Text TextUI; [...truncated...] TextUI.text = "Welcome to Number Wizard!"; TextUI.text = ("The highest number you can pick is " + max); TextUI.text = ("The lowest number you can pick is " + min); 

Ho già provato varie cose ma non ha funzionato, ad esempio:

 TextUI.text = "Welcome to Number Wizard!"; yield WaitForSeconds (3); TextUI.text = ("The highest number you can pick is " + max); yield WaitForSeconds (3); TextUI.text = ("The lowest number you can pick is " + min); 

In bash sarebbe:

 echo "Welcome to Number Wizard!" sleep 3 echo "The highest number you can pick is 1000" sleep 3 ..... 

ma non riesco a capire come lo faccio in Unity con C #

Ci sono molti modi per aspettare in Unity. È davvero semplice, ma penso che valga la pena di coprire la maggior parte dei modi per farlo:

1. Con una coroutine e WaitForSeconds .

Il è di gran lunga il modo più semplice. Metti tutto il codice che devi aspettare per un po ‘di tempo in una funzione di coroutine, quindi puoi aspettare con WaitForSeconds . Notare che nella funzione coroutine si chiama la funzione con StartCoroutine(yourFunction) .

L’esempio seguente ruoterà di 90 gradi, attenderà 4 secondi, ruoterà di 40 gradi e attenderà 2 secondi, quindi ruoterà definitivamente di 20 gradi.

 void Start() { StartCoroutine(waiter()); } IEnumerator waiter() { //Rotate 90 deg transform.Rotate(new Vector3(90, 0, 0), Space.World); //Wait for 4 seconds yield return new WaitForSeconds(4); //Rotate 40 deg transform.Rotate(new Vector3(40, 0, 0), Space.World); //Wait for 2 seconds yield return new WaitForSeconds(2); //Rotate 20 deg transform.Rotate(new Vector3(20, 0, 0), Space.World); } 

2. Con una coroutine e WaitForSecondsRealtime .

L’unica differenza tra WaitForSeconds e WaitForSecondsRealtime è che WaitForSecondsRealtime utilizza il tempo di attesa non Time.timeScale , il che significa che quando si interrompe un gioco con Time.timeScale , la funzione WaitForSecondsRealtime non sarà interessata ma WaitForSeconds farebbe.

 void Start() { StartCoroutine(waiter()); } IEnumerator waiter() { //Rotate 90 deg transform.Rotate(new Vector3(90, 0, 0), Space.World); //Wait for 4 seconds yield return new WaitForSecondsRealtime(4); //Rotate 40 deg transform.Rotate(new Vector3(40, 0, 0), Space.World); //Wait for 2 seconds yield return new WaitForSecondsRealtime(2); //Rotate 20 deg transform.Rotate(new Vector3(20, 0, 0), Space.World); } 

Aspetta e riesci ancora a vedere per quanto tempo hai aspettato:

3. Con una coroutine e incrementando una variabile ogni fotogramma con Time.deltaTime .

Un buon esempio di questo è quando hai bisogno del timer per visualizzare sullo schermo quanto tempo ha aspettato. Fondamentalmente come un timer.

È anche utile quando si desidera interrompere l’attesa / sospensione con una variabile boolean quando è vera. È qui che si yield break; può essere utilizzata.

 bool quit = false; void Start() { StartCoroutine(waiter()); } IEnumerator waiter() { float counter = 0; //Rotate 90 deg transform.Rotate(new Vector3(90, 0, 0), Space.World); //Wait for 4 seconds float waitTime = 4; while (counter < waitTime) { //Increment Timer until counter >= waitTime counter += Time.deltaTime; Debug.Log("We have waited for: " + counter + " seconds"); //Wait for a frame so that Unity doesn't freeze //Check if we want to quit this function if (quit) { //Quit function yield break; } yield return null; } //Rotate 40 deg transform.Rotate(new Vector3(40, 0, 0), Space.World); //Wait for 2 seconds waitTime = 2; //Reset counter counter = 0; while (counter < waitTime) { //Increment Timer until counter >= waitTime counter += Time.deltaTime; Debug.Log("We have waited for: " + counter + " seconds"); //Check if we want to quit this function if (quit) { //Quit function yield break; } //Wait for a frame so that Unity doesn't freeze yield return null; } //Rotate 20 deg transform.Rotate(new Vector3(20, 0, 0), Space.World); } 

È ancora ansible semplificare questo spostando il ciclo while in un’altra funzione di coroutine e cedendola, ma è anche ansible vederlo e persino interrompere il contatore.

 bool quit = false; void Start() { StartCoroutine(waiter()); } IEnumerator waiter() { //Rotate 90 deg transform.Rotate(new Vector3(90, 0, 0), Space.World); //Wait for 4 seconds float waitTime = 4; yield return wait(waitTime); //Rotate 40 deg transform.Rotate(new Vector3(40, 0, 0), Space.World); //Wait for 2 seconds waitTime = 2; yield return wait(waitTime); //Rotate 20 deg transform.Rotate(new Vector3(20, 0, 0), Space.World); } IEnumerator wait(float waitTime) { float counter = 0; while (counter < waitTime) { //Increment Timer until counter >= waitTime counter += Time.deltaTime; Debug.Log("We have waited for: " + counter + " seconds"); if (quit) { //Quit function yield break; } //Wait for a frame so that Unity doesn't freeze yield return null; } } 

Attendi / Sospendi fino a quando la variabile cambia o diventa uguale a un altro valore :

4. Con una coroutine e la funzione WaitUntil :

Attendere fino a quando una condizione diventa true . Un esempio è una funzione che aspetta che il punteggio del giocatore sia 100 quindi carica il livello successivo.

 float playerScore = 0; int nextScene = 0; void Start() { StartCoroutine(sceneLoader()); } IEnumerator sceneLoader() { Debug.Log("Waiting for Player score to be >=100 "); yield return new WaitUntil(() => playerScore >= 10); Debug.Log("Player score is >=100. Loading next Leve"); //Increment and Load next scene nextScene++; SceneManager.LoadScene(nextScene); } 

5. Con una coroutine e la funzione WaitWhile .

Attendi mentre una condizione è true . Un esempio è quando vuoi uscire dall’app quando viene premuto il tasto Esc.

 void Start() { StartCoroutine(inputWaiter()); } IEnumerator inputWaiter() { Debug.Log("Waiting for the Exit button to be pressed"); yield return new WaitWhile(() => !Input.GetKeyDown(KeyCode.Escape)); Debug.Log("Exit button has been pressed. Leaving Application"); //Exit program Quit(); } void Quit() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } 

6. Con la funzione Invoke :

Puoi chiamare tell Unity per chiamare la funzione in futuro. Quando si chiama la funzione Invoke , è ansible passare il tempo di attesa prima di chiamare quella funzione al suo secondo parametro. L’esempio seguente chiamerà la funzione feedDog() dopo 5 secondi che Invoke viene chiamato.

 void Start() { Invoke("feedDog", 5); Debug.Log("Will feed dog after 5 seconds"); } void feedDog() { Debug.Log("Now feeding Dog"); } 

7. Con la funzione Update() e Time.deltaTime .

È proprio come # 3 tranne che non usa la coroutine. Usa la funzione di Update .

Il problema con questo è che richiede così tante variabili in modo che non verrà eseguito ogni volta, ma solo una volta quando il timer è finito dopo l’attesa.

 float timer = 0; bool timerReached = false; void Update() { if (!timerReached) timer += Time.deltaTime; if (!timerReached && timer > 5) { Debug.Log("Done waiting"); feedDog(); //Set to false so that We don't run this again timerReached = true; } } void feedDog() { Debug.Log("Now feeding Dog"); } 

Ci sono ancora altri modi per aspettare in Unity, ma dovresti sicuramente conoscere quelli sopra menzionati, in modo che sia più facile creare giochi in Unity. Quando usarli dipende dalle circostanze.

Per il tuo problema particolare, questa è la soluzione:

 IEnumerator showTextFuntion() { TextUI.text = "Welcome to Number Wizard!"; yield return new WaitForSeconds(3f); TextUI.text = ("The highest number you can pick is " + max); yield return new WaitForSeconds(3f); TextUI.text = ("The lowest number you can pick is " + min); } 

E per chiamare / avviare la funzione di coroutine dalla funzione di avvio o di aggiornamento, la si chiama con

 StartCoroutine (showTextFuntion()); 

Hai usato correttamente WaitForSeconds. Ma sospetto che tu abbia provato a usarlo senza coroutine. Ecco come dovrebbe funzionare:

 public void SomeMethod() { StartCoroutine(SomeCoroutine()); } private IEnumerator SomeCoroutine() { TextUI.text = "Welcome to Number Wizard!"; yield return WaitForSeconds (3); TextUI.text = ("The highest number you can pick is " + max); yield return WaitForSeconds (3); TextUI.text = ("The lowest number you can pick is " + min); }