Petit conseil Pause, ralenti et doublé de temps dans Unity

Mettre en pause un jeu Unity est facile. Il y a plusieurs choses dont vous devriez être au courant, mais nous y reviendrons à la fin de ce conseil. Nous allons ajouter quelques boutons d'interface graphique simples pour contrôler le temps dans un projet Unity de base..


Aperçu du résultat final

Jetons un coup d'œil au résultat final sur lequel nous allons travailler:


Étape 1: Créer un nouveau projet

Commençons par ouvrir Unity et créer un nouveau projet. Vous voudrez peut-être ajouter une animation ou une sorte d’action à la procédure afin de pouvoir réellement voir un effet lorsque nous appuierons sur les boutons. Dans l'exemple fourni, je viens de faire quelques simples cubes de filature.

Ouvrir un nouveau projet est simple et agréable. Une fois le chargement de Unity terminé, si vous l'avez configuré pour afficher l'Assistant de projet, vous pouvez cliquer sur l'onglet "Créer un nouveau projet" et entrer un nom de fichier. L'unité s'occupera du reste. Si la fenêtre de l'assistant de projet n'apparaît pas au lancement de Unity, sélectionnez Fichier> Nouveau projet..


Étape 2: Créer un nouveau script JavaScript

Unity a son propre système d'interface graphique intégré, qui va bien au-delà de cette astuce. Disons simplement que tout se passe bien dans une interface graphique dans une fonction appelée OnGUI et la classe GUI fournit tout un tas de choses sympas, comme un bouton.

Allez-y et créez un nouveau script via le menu Actifs - sélectionnez Biens> Créer> JavaScript:

Votre nouveau script devrait apparaître dans la fenêtre Projet. Cliquez une fois sur le script et celui-ci devrait être mis en évidence afin de pouvoir le renommer. Nommez le script "PauseScript" et appuyez sur Entrée. Maintenant, nous voulons commencer à coder, alors allez-y et double-cliquez dessus cette fois. Cela devrait ouvrir l'éditeur de script par défaut avec le modèle / code par défaut d'Unity déjà présent. Une fois l'éditeur de script chargé, supprimez le code par défaut et remplacez-le par le code ci-dessous:

 function OnGUI () // affiche un bouton 'pause' si (GUI.Button (Rect (0,0120,30), "PAGGLE PAUSE")) ) appelle notre fonction de basculement doPauseToggle (); 

GUI.Button nécessite un rect (qui contient les x, y, la largeur et la hauteur de notre bouton) et la chaîne à afficher en son sein. Savoir si le bouton a été actionné est aussi simple que de mettre notre GUI.Button dessine la méthode dans une instruction if.


Étape 3: Codage de la fonction de basculement de pause

Ici, nous nous référons à une fonction que nous allons appeler doPauseToggle (). Ce sera une fonction simple qui vérifie si nous sommes en pause ou non, puis effectue l'action correcte. Ajoutez le code suivant au bas de votre script PauseScript.js, sous la fonction OnGUI que nous avons ajoutée à l'étape 2:

 function doPauseToggle () // nous vérifions ici si nous travaillons à une échelle de temps supérieure à 0 si (Time.timeScale> 0) // l'échelle de temps est supérieure à zéro, nous devons donc mettre le jeu en pause ici pauseGame () ;  else // l'échelle de temps était inférieure à zéro, nous mettons donc le jeu en pause unPauseGame (); 

Time.timeScale Voici comment nous gérons la mise en pause du jeu. Essentiellement, nous changeons l'échelle à laquelle le temps passe. Lorsque timeScale est 1.0, le temps est en temps réel. À zéro (0), le temps est suspendu. Donc dans notre doPauseToggle fonction, nous vérifions simplement si le temps est supérieur à zéro, sans pause, si nous appelons un nouveau pauseGame () une fonction. Sinon, unPauseGame () est appelé.


Étape 4: Coder les fonctions de pause et de pause

Les fonctions à l'étape 3, pauseGame () et unPauseGame (), manipulez simplement le Time.timeScale valeur égale à 0 ou 1. Ajoutez le code suivant au bas de votre script PauseScript.js, sous le code ajouté à l'étape 3:

 function pauseGame () // définit l'échelle à laquelle le temps passe à 0, temps de congélation (!) Time.timeScale = 0;  function unPauseGame () // définit l'échelle à laquelle le temps passe à 1 et s'exécute à nouveau en temps réel Time.timeScale = 1; 

Croyez-le ou non, c'est tout ce dont nous avons besoin pour ajouter un bouton de pause à un fichier Unity. Si vous avez une action dans votre scène Unity, vous verrez maintenant qu'elle se met en pause et se met en pause chaque fois que nous cliquons sur le bouton! Notez que si rien ne se passe dans votre scène, vous ne verrez rien se passer lorsque vous jouez.


Étape 5: Déplacement au ralenti

Pensez-vous à ce que je pense? Si 0 fait une pause et 1 le fait passer, qu'en est-il de 0,5? Pensez balle-time!

Premièrement, allons-y et ajoutons un nouveau bouton à notre OnGUI () une fonction. Déposez ceci au bas de la fonction, juste au dessus de la fermeture entretoise.

 // affiche un bouton 'slowmo' if (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // appelle notre fonction de basculement slowMo (); 

Nous avons maintenant besoin d’une nouvelle fonction pour ajuster le facteur temps sur une valeur inférieure à 1. Faites défiler jusqu’au bas de votre script PauseScript.js et ajoutez cette nouvelle fonction:

 function slowMo () // définit l'échelle à laquelle l'instant 5 passe à 0.1, s'exécutant dans slowmo Time.timeScale = 0.1; 

? prouvant ainsi que vous n'avez pas à être Neo pour bullet-time dans Unity!


Étape 6: Double temps!

Enfin, pour le plaisir, faisons en sorte que tout devienne un peu fou en jouant à deux temps. Bien que je n’aie jamais vu cela dans un vrai mécanicien de jeu, j’ai vu le temps temporairement mis à l’échelle pour obtenir un effet de particule opérationnel: c’était un effet de feu et l’auteur voulait que l’écran soit rempli de feu rapidement pour faire ressortir le fond de son menu écran à la vie. Il augmenta le temps de parole une seconde après le chargement du menu et le feu remplit l'écran. Il a ensuite réduit le temps à 1 pour que les flammes bougent correctement et que tout le reste du jeu soit à vitesse normale..

Pour ajouter le double de temps, nous suivrons la même procédure qu'à l'étape 5, en ajoutant un nouveau bouton qui appellera une nouvelle fonction. La nouvelle fonction réglera simplement notre échelle de temps sur 2. Trouvez le OnGUI () fonction dans votre script PauseScript.js et ajoutez ce qui suit au-dessus de la fin de la fonction et au-dessus de la fermeture accolade.

 // affiche un bouton 'double heure' if (GUI.Button (Rect (0,60,120,30), "DOUBLE TIME"))) // appelle notre fonction de basculement doubleTime (); 

Droite. Nous avons un bouton, ajoutons à cette fonction doubleTime ():

 function doubleTime () // définit l'échelle à laquelle le temps passe à 0.5, s'exécutant en slowmo Time.timeScale = 2; 

Pour le plaisir, essayez d’ajuster jusqu’à 100 fois l’échelle de temps et voyez ce qui se passe..


Faisons le point sur notre script. Voici le fichier PauseScript.js au complet, juste au cas où quelque chose de mauvais se produirait en cours de route:

 function OnGUI () // affiche un bouton 'pause' si (GUI.Button (Rect (0,0120,30), "PAGGLE PAUSE")) ) appelle notre fonction de basculement doPauseToggle ();  // affiche un bouton 'slowmo' if (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // appelle notre fonction de basculement slowMo ();  // affiche un bouton 'double heure' if (GUI.Button (Rect (0,60,120,30), "DOUBLE TIME"))) // appelle notre fonction de basculement doubleTime ();  function doPauseToggle () // nous vérifions ici si nous travaillons à une échelle de temps supérieure à 0 si (Time.timeScale> 0) // nous avons mis le jeu en pause ici pauseGame ();  else // l'échelle de temps était inférieure à zéro, nous mettons donc le jeu en pause unPauseGame ();  function pauseGame () // définit l'échelle à laquelle le temps passe à 0, temps de congélation (!) Time.timeScale = 0;  function unPauseGame () // définit l'échelle à laquelle le temps passe à 1 et s'exécute à nouveau en temps réel Time.timeScale = 1;  function slowMo () // définit l'échelle à laquelle le temps passe à 0.1, s'exécutant en slowmo Time.timeScale = 0.1;  function doubleTime () // définit l'échelle à laquelle le temps passe à 0.5, s'exécutant en slowmo Time.timeScale = 2; 

Derniers mots et quelques pièges!

Il est important de noter que Time.timeScale n'affectera pas le code dans un Mettre à jour() une fonction. La mise à jour a lieu à chaque "tick" et cela se produit en dehors de la plage de temps. Par conséquent, si vous souhaitez que des choses se produisent pendant la pause du jeu, comme une animation en arrière-plan, l'emplacement de mise à jour est probablement Update. Consultez la documentation de Unity pour plus d’informations à ce sujet..

Notez que si vous changez le Time.timeScale valeur, toutes les actions liées au temps, telles que les appels à la fonction Invoke ou les temporisateurs utilisant des valeurs de Time.time, seront également affectés par la modification. Si votre jeu est deux fois plus rapide, vous devrez diviser par deux la vitesse de vos actions basées sur le temps (par exemple, si vous avez un jeu de course avec un chronomètre et que Time.aleScale est réglé sur 2.0, vous devrez ralentir le chronomètre de moitié pour qu'il mesure le temps avec précision).

Les réactions physiques ne sont pas directement affectées, votre jeu devrait donc fonctionner comme d'habitude, mais uniquement sur une échelle de temps différente..

C'est tout! Merci d'avoir lu mon petit conseil. Jouer avec Time.timeScale et j'ai hâte de voir des effets sympas de type Matrix dans vos projets. Amusez-vous, faire des jeux!