Gestion Temps

Tu trouveras sur cette page :

Calculer le temps

Time.deltaTime

Il s’agit duĀ temps Ć©coulĆ© depuis la derniĆØre image. Logiquement, plus le nombre d’images par seconde sera grand, et plus ce temps sera petit.

A quoi deltaTime peut bien servir?

Supposons que le joueur se déplace à une certaine vitesse à chaque image, il sera forcément bien plus rapide pour les ordinateurs qui sont plus puissants et tournent à 60 images par seconde, en comparaison à un ordinateur moins puissant qui tourne à 15 images par seconde. Nous, on préfère que tous les joueurs se déplacent à la même vitesse peu importe le nombre de fps! 

Pour Ć©viter que la vitesse du joueur dĆ©pende de la puissance de l’ordinateur, on va utiliser Time.deltaTime. Comme il s’agit du temps Ć©coulĆ© depuis la derniĆØre image. Plus le nombre d’images par seconde sera grand, et plus ce temps sera petit. On peut donc l’utiliser pour uniformiser la vitesse:Ā 

transform.Translate(direction * vitesse * Time.deltaTime)

Ici, direction est un vecteur vers lequel se diriger et vitesse est un float qui dĆ©finit la vitesse qu’on veut donner au joueur.

Creer des timers

Script de Timer

Avec un simple script on peut crĆ©er des timers ultra facilement et rĆ©-utilisable dans n’importe quel autre script!
Il suffit de mettre ce script ci sur un objet du niveau (unique, un objet qui sert de gestionnaire de temps) et c’est parti!

On peut utiliser ainsi ce script pour crĆ©er des temps d’attentes, des chronomĆØtres qui dĆ©clenches des choses quand ils se finissent, etc.

using UnityEngine;
using System;
using System.Collections.Generic;

public class Timers : MonoBehaviour
{
Ā  Ā  // Liste qui contient tous les timers actifs
Ā  Ā  public static List<Timer> timers = new List<Timer>();

Ā  Ā  private void Update() {
        // Boucle pour retirer les timers terminés
Ā  Ā  Ā  Ā  foreach (Timer timer in timers) {
Ā  Ā  Ā  Ā  Ā  Ā  timer.Update(Time.deltaTime);//met Ć© jour les timers
Ā  Ā  Ā  Ā  Ā  Ā  if (timer.fini)
Ā  Ā  Ā  Ā  Ā  Ā  Ā  Ā  timers.Remove(timer);
Ā  Ā  Ā  Ā  Ā  Ā  Ā  Ā  break; //pour eviter un message d'erreur dans la liste
Ā  Ā  Ā  Ā  }
Ā  Ā  }

    // fonction pour démarrer un nouveau timer, peut etre utilisée depuis n'importe quel script avec ce code:
Ā  Ā  // Timers.StartTimer(TEMPS ICI, FONCTION ICI);
Ā  Ā  public static void StartTimer(float duree, Action action) {
Ā  Ā  Ā  Ā  timers.Add(new Timer(duree, action));
Ā  Ā  }

    // Classe interne qui représente un timer individuel
Ā  Ā  public class Timer
Ā  Ā  {
        private float duree;      // Durée totale du timer
        private float tempsecoule;   // Temps écoulé depuis le démarrage du timer
        private Action action;     // Action é exécuter lorsque le timer se termine
        public bool fini;// Indique si le timer est terminé

        public Timer(float duration, Action callback) { //quand on génére un timer, on copie les chiffres donnés dans ses propres propriétés
Ā  Ā  Ā  Ā  Ā  Ā  this.duree = duration;
Ā  Ā  Ā  Ā  Ā  Ā  this.action = callback;
Ā  Ā  Ā  Ā  Ā  Ā  tempsecoule = 0f;
Ā  Ā  Ā  Ā  Ā  Ā  fini = false;
Ā  Ā  Ā  Ā  }
Ā  Ā  Ā  Ā  //et on fait tourner le timer
Ā  Ā  Ā  Ā  public void Update(float deltaTime) {
Ā  Ā  Ā  Ā  Ā  Ā  if (fini)
Ā  Ā  Ā  Ā  Ā  Ā  Ā  Ā  return;
Ā  Ā  Ā  Ā  Ā  Ā  tempsecoule += deltaTime;
            //si il est fini, il lance l'action qui é été attaché
Ā  Ā  Ā  Ā  Ā  Ā  if (tempsecoule >= duree) {
Ā  Ā  Ā  Ā  Ā  Ā  Ā  Ā  action?.Invoke();
Ā  Ā  Ā  Ā  Ā  Ā  Ā  Ā  fini = true;
Ā  Ā  Ā  Ā  Ā  Ā  }
Ā  Ā  Ā  Ā  }
Ā  Ā  }
}

BouclierTimer (Désactiver un Pouvoir après un laps de temps)

Dans cet exemple, je vais ramasser un objet bonus qui active un Pouvoir limité dans le temps. 

En premier lieu je crĆ©e l’objet bonus sur la scĆØne Ć  ramasser. Je vais lui donner un tag, un box collider (avec IsTrigge cocher). Je vais Ć©galement crĆ©er mon pouvoir. Dans mon cas, il s’agira d’un bouclier. Je crĆ©e mon bouclier un 2D Object > Sprite > Cercle entant qu’enfant de mon HĆ©ros, par dĆ©faut je vais le rendre Inactif au le dĆ©but du jeu.Ā 

Je vais maintenant crƩer un nouveau script Ơ donner au HƩros. On va commencer par ramasser le bonus et activer le Pouvoir


public string cible; // Ć  renseigner dans l’inspector
    public GameObject Pouvoir; // glisser l’objet Pouvoir

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == cible)
        {
            Destroy(collision.gameObject); //dĆ©truire le bonus
            Pouvoir.SetActive(true); // activer le pouvoir
        }  
    }

    public void ArretPouvoir(){
        Pouvoir.SetActive(false); // desactiver le pouvoir
        }

Puis on crƩe le chrono qui arrive Ơ Zero et arretera le pouvoir:

Timers.StartTimer(5f, ArretPouvoir);

Et pour finir on va dƩsactiver le Pouvoir au dƩmarrage du jeu et donner du temps au chrono

public string cible; // Ć  renseigner dans l’inspector
    public GameObject Pouvoir; // glisser l’objet Pouvoir

    private void Start()
    {
   Pouvoir.SetActive(false); // inactiver le pouvoir
   chrono = Timer; // attribuer le temps dĆ©finir au chrono
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == cible)
        {
            Destroy(collision.gameObject); //dĆ©truire le bonus
            Pouvoir.SetActive(true); // activer le pouvoir
            Timers.StartTimer(5f, ArretPouvoir);
        }  
    }

    public void ArretPouvoir(){
        Pouvoir.SetActive(false); // desactiver le pouvoir
        }

Si il s’agit d’un bouclier n’oublies pas de lui donner Circle Collider 2D et le Script qui DĆ©truit les cibles !

ChronomĆØtre

Tu peux retrouver une autre version du chronomètre, avec les scripts à copier-coller, si tu préfère les tutoriels écrit plutÓt que les vidéos ci-dessous:

GƩrer le dƩlai

Tu aimerais pouvoir dĆ©clencher du code aprĆØs un certain dĆ©lai? Ce guide est fait pour toi! Tu apprendras comment crĆ©er un dĆ©lai, rĆ©pĆ©ter le chronomĆØtre et inclure de l’alĆ©atoire!

DƩlai simple

Voici un script d’exemple avec tous les Ć©lĆ©ments qui te permettront de crĆ©er un dĆ©lai!Ā 

public class NomDeTonScript : MonoBehaviour
{
Ā  Ā  public float delaiMax;
Ā  Ā  private float prochaineApparition;

Ā  Ā  private void Start()
Ā  Ā  {
Ā  Ā  Ā  Ā  prochaineApparition = delaiMax;
Ā  Ā  }

Ā  Ā  private void Update()
Ā  Ā  {
Ā  Ā  Ā  Ā  if(Time.time > prochaineApparition)
Ā  Ā  Ā  Ā  {
Ā  Ā  Ā  Ā  Ā  Ā  // mets ton code ici!
Ā  Ā  Ā  Ā  }
Ā  Ā  }
}
Explication des variables
  • public float delaiMax – sert Ć  dĆ©finir le temps d’attente en secondes. Comme c’est une variable publique, tu peux le modifier depuis l’inspecteur. N’oublie pas de le changer dans l’inspecteur pour qu’il ne soit pas Ć©gal Ć  zĆ©ro! (sinon il est inutile)
  • private float prochaineApparition – variable qui va stocker le moment (en secondes) qu’il faudra dĆ©passer pour dĆ©clencher le code!
Explication du Start

Sert Ć  initialiser le prochain temps d’apparition (en secondes) en fonction du dĆ©lai indiquĆ© dans l’inspecteur.Ā 

Explication de l’Update

Time.timeĀ est la variable qui indique le temps passĆ© depuis le dĆ©but du jeu (en seconde). On vĆ©rifie si ce temps dĆ©passe celui qu’on a fixĆ© pour la prochaineApparition. Si c’est le cas, Ƨa dĆ©clenche le code Ć  l’intĆ©rieur de la condition!

Redémarrer le chronomètre

Tel quel, le script attend juste un dĆ©lai pour faire ce qu’on lui demande. Cela serait bien de pouvoir redĆ©marrer le chrono pour qu’il puisse exĆ©cuter ton code Ć  intervalles rĆ©guliers! Imaginons par exemple que tu veuilles faire apparaĆ®tre des obstacles toutes les deux secondes!
Ajoute Ć  ton script une fonction qui permet de redĆ©marrer le chrono.Ā Tout ce que fait cette fonction est de rĆ©pĆ©ter ce qu’on a dĆ©jĆ  Ć©crit dans la fonction Start.
private void RedemarrerLeChrono()
    {
        prochaineApparition = Time.time + delaiMax;
    }

D’ailleurs c’est pour cette raison que tu peux remplacer ce que tu as mis dans Start par un simple appel de la fonction RedemarrerLeChrono();

Ā private void Start()
Ā  Ā  {
Ā  Ā  Ā  Ā  RedemarrerLeChrono();
Ā  Ā  }
private void Update()
Ā  Ā  {
Ā  Ā  Ā  Ā  if(Time.time > prochaineApparition)
Ā  Ā  Ā  Ā  {
Ā  Ā  Ā  Ā  Ā  Ā  Ā RedemarrerLeChrono();
Ā  Ā  Ā  Ā  Ā  Ā  // mets ton code ici!
Ā  Ā  Ā  Ā  }
Ā  Ā  }

Dans la fonction Update, tu vas appeler RedemarrerLeChrono() Ć  chaque fois que la condition est remplie.

Cela aura pour effet de faire redĆ©marrer le chronomĆØtre Ć  chaque fois que le dĆ©lai est atteint. Le code que tu vas Ć©crire Ć  l’intĆ©rieur de la condition ne sera exĆ©cutĆ© qu’à intervalles rĆ©guliers.Ā 

Redémarrer le chronomètre dans un délai aléatoire

C’est trĆØs sympa d’avoir du code qui s’exĆ©cute rĆ©guliĆØrement comme une horloge, mais c’est souvent plus faire d’ajouter de l’alĆ©atoire dedans! Ne pas prĆ©voir quand apparaĆ®tra le prochain obstacle est bien plus amusant pour le joueur! Pour cela, rien de plus simple: il faut juste modifier la fonction RedemarrerLeChrono() en y intĆ©grant un dĆ©lai alĆ©atoire.

private void RedemarrerLeChrono()
Ā  Ā  {
Ā  Ā  Ā  Ā  prochaineApparition = Time.time + Random.Range(0, delaiMax);
Ā  Ā  }

BouclierTimer (Désactiver un Pouvoir après un laps de temps)

Dans cet exemple, je vais ramasser un objet bonus qui active un Pouvoir limité dans le temps. 

En premier lieu je crĆ©e l’objet bonus sur la scĆØne Ć  ramasser. Je vais lui donner un tag, un box collider (avec IsTrigge cocher). Je vais Ć©galement crĆ©er mon pouvoir. Dans mon cas, il s’agira d’un bouclier. Je crĆ©e mon bouclier un 2D Object > Sprite > Cercle entant qu’enfant de mon HĆ©ros, par dĆ©faut je vais le rendre Inactif au le dĆ©but du jeu.Ā 

Je vais maintenant crƩer un nouveau script Ơ donner au HƩros. On va commencer par ramasser le bonus et activer le Pouvoir

Voici une petite vidĆ©o qui t’explique cela en dĆ©tail

Ā  Ā  publicĀ string cible; // Ć  renseigner dans l’inspector
Ā  Ā  public GameObject Pouvoir; // glisser l’objet Pouvoir

Ā  Ā  privateĀ voidĀ OnTriggerEnter2D(Collider2D collision)
Ā  Ā  {
Ā  Ā  Ā  Ā  if(collision.tag == cible)
Ā  Ā  Ā  Ā  {
Destroy(collision.gameObject); //dƩtruire le bonus
Pouvoir.SetActive(true); // activer le pouvoir
}
Ā  Ā  }

Puis on crĆ©e le chrono qui arrive Ć  ZĆ©ro arrĆŖtera le pouvoir, Ainsi que dĆ©finir le temps qu’on veut d’activation du pouvoir.

public int Timer = 10; // indiquer le temps désirer, par défaut à 10
privateĀ float chrono; // le chrono qui va diminuerĀ 

Et on va commencer Ć  retirer du temps au chrono dĆØs que le Pouvoir est actif.

Ā  Ā  voidĀ Update()
{
if (Pouvoir == true)
{
//chrono qui tourne
if (chrono > 0)
{
chrono -= Time.deltaTime; // on retire du temps au chrono
}
else
{ //quand chrono est fini, bouclier s’éteint
Pouvoir.SetActive(false);
chrono = Timer; // redonne du temps au chrono
}
}
}

Et pour finir on va dƩsactiver le Pouvoir au dƩmarrage du jeu et donner du temps au chrono

Ā  Ā  privateĀ voidĀ Start()
Ā  Ā  {
Ā  Pouvoir.SetActive(false); // inactiver le pouvoir
  chrono = Timer; // attribuer le temps définir au chrono
Ā  Ā  }

Si il s’agit d’un bouclier n’oublies pas de lui donner Circle Collider 2D et le Script qui DĆ©truit les cibles !
Retour en haut