Menu
CoddyTech

Suivi fluide

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 47 sur 71.

Une caméra qui copie la position du joueur en y ajoutant un décalage dans LateUpdate() transforme chaque secousse du joueur en secousse de la vue. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) renvoie une position qui se rapproche de target comme le ferait un ressort amorti : elle accélère, ralentit à mesure qu’elle approche de la cible et l’atteint sans la dépasser. Cette caméra suit le joueur depuis une position située 3 unités plus haut et 6 unités derrière, avec un léger retard :

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref transmet à SmoothDamp la variable elle-même au lieu d’une copie, afin que la méthode puisse la modifier. SmoothDamp conserve dans velocity la vitesse actuelle de la caméra sur les trois axes et en a besoin à nouveau à la frame suivante, c’est pourquoi cette variable est un champ. Déclarée à l’intérieur de LateUpdate(), elle repartirait de zéro à chaque frame et la caméra avancerait à peine, d’environ un demi pour cent du trajet par frame. Pour un seul nombre, comme le zoom d’une caméra, Mathf.SmoothDamp fonctionne de la même manière avec une vitesse de type float.

smoothTime détermine le retard de la caméra : avec une valeur de 0.3, elle rattrape environ 60 % d’un saut soudain en 0.3 seconde et est presque arrivée au bout d’1 seconde. Une valeur plus petite permet un suivi plus serré. SmoothDamp lit lui-même Time.deltaTime, donc rien dans l’appel ne doit être multiplié par cette valeur.

challenge icon

Défi

Moyen

Faites suivre le joueur par la caméra en douceur depuis une hauteur fixe.

  1. Ajoutez un champ Vector3 velocity;.
  2. Dans LateUpdate(), construisez Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, afin qu’un saut ne déplace pas la vue.
  3. Définissez transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

Appuyez sur « Jouer », courez et sautez : la caméra suit le joueur avec un léger retard et ne bouge jamais de haut en bas. Puis appuyez sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // Déplace doucement la caméra vers le point situé au-dessus du joueur (x), à back unités derrière lui (z), à une hauteur fixe.
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity