Menu
CoddyTech

Tremblement de la caméra

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

Une secousse est une brève série de décalages aléatoires : pendant quelques dixièmes de seconde, la caméra se retrouve à un emplacement aléatoire proche de sa position de repos, différent à chaque image, puis revient à sa position initiale. Une coroutine convient, car elle s’exécute sur plusieurs images et se termine toute seule. 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, de sorte que la secousse dure 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 reste à l’endroit où le dernier décalage l’a laissée.

À chaque image, Unity exécute toutes les méthodes Update(), puis les coroutines en attente de yield return null, puis toutes les méthodes LateUpdate(). Ainsi, une caméra qui suit un objet et définit sa position dans LateUpdate() écrase tout effet de la secousse. Secouer localPosition évite ce problème lorsque la caméra est l’enfant d’un objet vide qui effectue le suivi : le parent se déplace, et la caméra tremble autour de sa position sous celui-ci.

challenge icon

Défi

Moyen

Fais trembler la caméra suivante en appuyant sur Espace.

  1. Ajoute un champ Vector3 shake;, et dans LateUpdate(), définis transform.position = player.position + offset + shake;.
  2. Dans Shake(), tant que elapsed < duration : shake = Random.insideUnitSphere * strength;, ajoute Time.deltaTime à elapsed, puis yield return null;.
  3. Après la boucle, définis shake = Vector3.zero;.

Appuie sur « Jouer », lance le jeu et appuie sur Espace : la vue tremble tout en suivant le joueur. Puis clique sur « Vérifier ».

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, avec un écart maximal de strength par rapport à sa position de suivi.
        yield return null;
    }
}

Toutes les leçons de Physique et gameplay

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