Suggerimento rapido pausa, movimento lento e doppio tempo in unità

Mettere in pausa un gioco Unity è facile. Ci sono un paio di cose di cui dovresti essere a conoscenza, ma arriveremo a quelli alla fine di questo suggerimento. Aggiungeremo alcuni semplici pulsanti della GUI per controllare il tempo all'interno di un progetto Unity di base.


Anteprima del risultato finale

Diamo un'occhiata al risultato finale su cui lavoreremo:


Passaggio 1: crea un nuovo progetto

Iniziamo aprendo Unity e creando un nuovo progetto. Potresti voler aggiungere qualche animazione o qualche tipo di azione al procedimento, in modo che tu possa effettivamente vedere un effetto quando premiamo i pulsanti. Nell'esempio fornito, ho appena creato alcuni cubi rotanti semplici.

Aprire un nuovo progetto è bello e semplice. Una volta che Unity ha terminato il caricamento, se lo hai impostato per mostrare la procedura guidata del progetto, puoi fare clic sulla scheda "Crea nuovo progetto" e inserire un nome file. L'unità si prenderà cura di tutto il resto. Se la finestra Procedura guidata progetto non viene visualizzata all'avvio di Unity, vai su File> Nuovo progetto.


Passaggio 2: crea un nuovo script JavaScript

Unity ha il suo sistema GUI integrato, che va ben oltre questo consiglio. Diciamo solo che tutte le GUI saggi avvengono in una funzione chiamata OnGUI e la classe GUI fornisce un sacco di cose interessanti, come un pulsante.

Vai avanti e crea un nuovo script attraverso il menu Risorse: seleziona Risorse> Crea> JavaScript:

Il tuo nuovo script dovrebbe apparire nella finestra Progetto. Fare clic una volta sullo script e dovrebbe evidenziare in modo che sia possibile rinominarlo. Assegna un nome allo script "PauseScript" e premi invio. Ora vogliamo iniziare la codifica, quindi vai avanti e fai doppio clic su questa volta. Dovrebbe aprire l'editor di script predefinito con il modello / codice predefinito di Unity già presente. Una volta caricato l'editor di script, elimina il codice predefinito e sostituiscilo con il codice seguente:

 funzione OnGUI () // mostra un pulsante 'pause' se (GUI.Button (Rect (0,0,120,30), "TOGGLE PAUSE")) // chiama la nostra funzione di commutazione doPauseToggle (); 

GUI.Button richiede un Rect (che contiene x, y, larghezza e altezza del nostro pulsante) e la stringa da visualizzare al suo interno. Scoprire se il pulsante è stato premuto o meno è semplice come mettere il nostro GUI.Button disegnare il metodo in un'istruzione if.


Passaggio 3: codifica della funzione di commutazione pausa

Qui, ci riferiamo a una funzione che chiameremo doPauseToggle (). Questa sarà una semplice funzione che controlla se siamo in pausa o non sospesi, quindi esegue l'azione corretta. Aggiungi il seguente codice alla fine dello script PauseScript.js, sotto la funzione OnGUI che abbiamo aggiunto nel Passaggio 2:

 function doPauseToggle () // qui controlliamo se stiamo eseguendo una scala temporale superiore a 0 se (Time.timeScale> 0) // la scala temporale è sopra lo zero, quindi dobbiamo mettere in pausa il gioco qui pauseGame () ;  else // la scala temporale era inferiore a zero, quindi abbiamo riattivato il gioco qui unPauseGame (); 

Time.timeScale è come ci occupiamo di mettere in pausa il gioco. In sostanza, cambiamo la scala a cui sta passando il tempo. Quando timeScale è 1.0, l'ora è in tempo reale. A zero (0), il tempo è in pausa. Quindi nel nostro doPauseToggle funzione semplicemente controlliamo per vedere se il tempo è maggiore di zero, non-pausa, se così si chiama un nuovo pauseGame () funzione. In caso contrario, viene chiamato unPauseGame ().


Passaggio 4: codifica delle funzioni di pausa e non pausa

Le funzioni nel passaggio 3, pauseGame () e unPauseGame (), semplicemente manipolare il Time.timeScale valore su 0 o 1. Aggiungi il seguente codice alla fine dello script PauseScript.js, sotto il codice aggiunto al passaggio 3:

 function pauseGame () // imposta la scala in cui il tempo passa a 0, tempo di congelamento (!) Time.timeScale = 0;  function unPauseGame () // imposta la scala alla quale il tempo passa a 1, eseguendo nuovamente in tempo reale Time.timeScale = 1; 

Che ci crediate o no, è tutto ciò che dobbiamo fare per aggiungere un pulsante di pausa a un file Unity. Se hai qualche azione nella scena Unity, vedrai che si ferma e si interrompe quando clicchiamo sul pulsante! Nota che se non hai niente nella tua scena, non vedrai accadere nulla quando premi il gioco.


Passaggio 5: spostamento al rallentatore

Stai pensando a cosa sto pensando? Se 0 fa una pausa e 1 lo fa andare, che dire di 0.5? Pensa a tempo di proiettile!

Per prima cosa, andiamo avanti e aggiungiamo un nuovo pulsante al nostro OnGUI () funzione. Rilasciare questo nella parte inferiore della funzione, appena sopra la chiusura sostegno.

 // mostra un pulsante 'slowmo' se (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // chiama la nostra funzione di commutazione slowMo (); 

Ora abbiamo bisogno di una nuova funzione per regolare il fattore tempo su meno di 1. Scorri verso il basso fino allo script PauseScript.js e aggiungi questa nuova funzione:

 function slowMo () // imposta scala a cui time 5asses a 0.1, in esecuzione in slowmo Time.timeScale = 0.1; 

? dimostrando così che non devi essere Neo per il bullet-time in Unity!


Passaggio 6: doppio tempo!

Finalmente, per divertimento, facciamo diventare tutto un po 'pazzo suonando in doppio tempo. Anche se non l'ho visto usato in una vera meccanica di gioco, ho visto temporaneamente il tempo ridimensionato per ottenere un effetto particellare attivo e funzionante - è stato un effetto di fuoco e l'autore voleva che lo schermo si riempisse di fuoco rapidamente per portare lo sfondo del suo schermo del menu alla vita. Ha ridimensionato il tempo in alto per un secondo dopo che il menu è stato caricato e il fuoco ha riempito lo schermo. Ridusse quindi il tempo a 1 in modo che le fiamme si muovessero correttamente e tutto il resto del gioco fosse a velocità regolare.

Per aggiungere il doppio, seguiremo la stessa procedura del passaggio 5, aggiungendo un nuovo pulsante che chiamerà una nuova funzione. La nuova funzione imposterà semplicemente il nostro timeScale su 2. Trova il OnGUI () funzione nello script PauseScript.js e aggiungi quanto segue, sopra la fine della funzione e sopra la chiusura parentesi graffa.

 // mostra un pulsante 'double time' se (GUI.Button (Rect (0,60,120,30), "DOUBLE TIME")) // chiama la nostra funzione di commutazione doppiaTime (); 

Destra. Abbiamo un pulsante, aggiungiamo la funzione doubleTime ():

 function doubleTime () // imposta la scala in corrispondenza del quale il tempo passa a 0.5, eseguito in slowmo Time.timeScale = 2; 

Per divertimento, prova a regolare il timeScale fino a 100 e guarda cosa succede.


Facciamo un bilancio della nostra sceneggiatura. Ecco come funziona il file PauseScript.js, nel caso in cui accadesse qualcosa di brutto lungo il percorso:

 funzione OnGUI () // mostra un pulsante 'pause' se (GUI.Button (Rect (0,0,120,30), "TOGGLE PAUSE")) // chiama la nostra funzione di commutazione doPauseToggle ();  // mostra un pulsante 'slowmo' if (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // chiama la nostra funzione toggle slowMo ();  // mostra un pulsante 'double time' se (GUI.Button (Rect (0,60,120,30), "DOUBLE TIME")) // chiama la nostra funzione di commutazione doppiaTime ();  function doPauseToggle () // qui controlliamo se stiamo eseguendo una scala temporale superiore a 0 se (Time.timeScale> 0) // la scala temporale è sopra lo zero, quindi dobbiamo mettere in pausa il gioco qui pauseGame ();  else // la scala temporale era inferiore a zero, quindi abbiamo riattivato il gioco qui unPauseGame ();  function pauseGame () // imposta la scala in corrispondenza del quale il tempo passa a 0, tempo di congelamento (!) Time.timeScale = 0;  function unPauseGame () // imposta la scala alla quale il tempo passa a 1, eseguendo nuovamente in tempo reale Time.timeScale = 1;  function slowMo () // imposta la scala in corrispondenza del quale il tempo passa a 0.1, eseguito in slowmo Time.timeScale = 0.1;  function doubleTime () // imposta la scala in corrispondenza del quale il tempo passa a 0.5, eseguito in slowmo Time.timeScale = 2; 

Parole finali e un paio di trucchi!

È importante notare che Time.timeScale non influenzerà il codice all'interno di Aggiornare() funzione. L'aggiornamento ha luogo ogni "tick" e avviene al di fuori della scala temporale, quindi se hai bisogno che le cose accadano mentre il gioco è in pausa, come ad esempio un'animazione in background, il posto in cui metterlo è molto probabilmente Aggiornamento. Controlla la documentazione di Unity per maggiori informazioni al riguardo.

Si noti che se si modifica il Time.timeScale valore, qualsiasi modifica relativa al tempo, ad esempio le chiamate alla funzione Invoke o qualsiasi timer che utilizza valori da Time.time, sarà influenzata dalla modifica. Se il tuo gioco gira al doppio della velocità, dovrai dimezzare la velocità delle tue azioni basate sul tempo (ad esempio, se hai un gioco di corse con un cronometro e Time.timeScale è impostato su 2.0, dovrai rallenta il cronometro di circa la metà per misurare accuratamente il tempo).

Le reazioni fisiche non sono direttamente influenzate, quindi il tuo gioco dovrebbe funzionare normalmente, in base alle collisioni e alla fisica, solo su una scala temporale diversa.

Questo è tutto! Grazie per aver letto il mio suggerimento. Gioca con Time.timeScale e non vedo l'ora di vedere fantastici effetti simili a Matrix nei tuoi progetti. Divertiti, crea giochi!