Unity : Gestion des déplacements dans un jeu, frame per second et Time.deltaTime

Publié le 14/12/2017 dans Unity

​Je viens de comprendre, une des bases en ce qui concerne le déplacement d’objets dans un jeu vidéo.

Dans Unity, on peut effectuer des actions sur des game objects via des scripts. Une des fonctions de base est la fonction Update. Cette fonction permet d’exécuter des actions à chaque frame. Une seconde de jeu est composée de plusieurs frames mais ce nombre de frames est dépendant de la vitesse de l’ordinateur. Un ordinateur peut très bien afficher 30 frames par seconde, un autre 60 frames par secondes.

Le problème concernant les déplacements, c’est qu’on serait tenté de déplacer un objet en se basant sur le nombre de frames mais vu que ce nombre est aléatoire, le déplacement le sera aussi.

Il faut donc se baser non pas sur le nombre de frames mais plutôt sur le temps en secondes.

Un exemple sera bien plus parlant :

// A ne pas faire
Update(){
// On avance de 10 unités par frame
transform.position = new Vector2(transform.position.x + 10, 0);
}

// A faire
Update(){
// On avance de 10 unités par seconde
transform.position = new Vector2(transform.position.x + (Time.deltaTime * 10), 0);
}

 

Dans le 1er exemple, on déplace l’objet de 10 unités par rapport à sa position actuelle à chaque frame. Vu que cette instruction va être appelée à chaque frame, cela veut dire que si notre jeu tourne a 10 frames par seconde (fps), le déplacement sera de 10 * 10 soit 100 unités par seconde. Le problème, c’est que si notre jeu passe à un rythme de 5 fps (grâce à une moins bonne performance de l’ordinateur par exemple), le déplacement sera alors de 50 unités par seconde. Cela peut grandement fausser le rythme du jeu.

Pour éviter le problème, il faut utiliser la fonction Time.deltaTime. Cette fonction renvoie le temps en seconde écoulé depuis la dernière frame. Ainsi, dans le 2ème exemple, nous multiplions les unités de déplacement par le temps écoulé.

Si la 1ère frame est exécutée en 0.1 seconde, on a alors : 10 * 0.1 = 1 unité, si la 2ème frame est jouée en 0.2 seconde on aura, 10 * 0.2 = 2 unités, si la 3ème est joué en 0.4 seconde, on aura 10 * 0.4 = 4 unités et si la 4ème frame est jouée en 0.3 seconde, on aura : 10 * 0.3 = 3 unités.

Pour ces 4 frames jouées on aura en tout un déplacement de 1 + 2 + 4 + 3 = 10 unités ! Et ce quel que soit le rythme des frames.