Menu
CoddyTech

Tremblement de la caméra

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

Un tremblement consiste en une brève succession de décalages aléatoires : pendant quelques dixièmes de seconde, la caméra se trouve à un endroit aléatoire près de sa position de repos, qui change à chaque image, puis elle revient à sa position initiale. Une coroutine convient, car elle s’exécute sur plusieurs images et se termine d’elle-même. Cette caméra tremble lorsqu’un rocher atterrit (un autre script appelle BoulderLanded() ; le fichier commence par using System.Collections; pour IEnumerator) :

public float strength = 0.2f;
public float duration = 0.4f;
Vector3 rest;

void Start()
{
    rest = transform.localPosition;
}

public void BoulderLanded()
{
    StartCoroutine(Shake());
}

IEnumerator Shake()
{
    float elapsed = 0f;
    while (elapsed < duration)
    {
        transform.localPosition = rest + Random.insideUnitSphere * strength;
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.localPosition = rest;
}

Random.insideUnitSphere * strength est un décalage aléatoire d’une longueur maximale de strength, dans n’importe quelle direction, et yield return null en choisit un nouveau à l’image suivante. Ajouter Time.deltaTime à chaque passage permet de compter les secondes réelles ; le tremblement dure donc duration, quelle que soit la fréquence d’images. La dernière ligne remet la caméra à sa position initiale ; sans elle, la caméra resterait là où le dernier décalage l’a laissée.

À chaque image, Unity exécute tous les Update(), puis les coroutines en attente de yield return null, puis tous les LateUpdate(). Ainsi, une caméra qui suit une cible et définit sa position dans LateUpdate() écrase tout ce que le tremblement a fait. Faire trembler localPosition évite cela lorsque la caméra est l’enfant d’un objet vide qui assure le suivi : le parent se déplace et la caméra tremble autour de sa position par rapport à lui.

challenge icon

Défi

Moyen

Cette caméra suit le joueur (les flèches la déplacent) : dans LateUpdate(), elle se trouve à la position du joueur plus offset, et elle n’est l’enfant d’aucun objet. Faites-la trembler tout en continuant à suivre le joueur :

  • La barre d’espace la fait trembler pendant duration (0.4) seconde. À chaque image du tremblement, la caméra se trouve à un nouvel emplacement aléatoire, à une distance maximale de strength (0.3) de sa position de suivi, tout en continuant à suivre le joueur.
  • Lorsque le tremblement se termine, elle revient exactement à sa position de suivi.

La barre d’espace démarre déjà la coroutine Shake(). Appuyez sur Play, déplacez-vous et appuyez sur la barre d’espace, puis cliquez sur Check.

Essayez vous-même

using System.Collections;
using UnityEngine;

public class ShakeFollow : MonoBehaviour
{
    public Transform player;
    public Vector3 offset = new Vector3(0, 4, -8);
    public float strength = 0.3f;
    public float duration = 0.4f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    void LateUpdate()
    {
        transform.position = player.position + offset;
    }

    IEnumerator Shake()
    {
        // Fais trembler la caméra pendant duration secondes, en l'écartant au maximum de strength de sa position de suivi.
        yield return null;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Physique et gameplay