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.
Défi
MoyenFais trembler la caméra suivante en appuyant sur Espace.
- Ajoute un champ
Vector3 shake;, et dansLateUpdate(), définistransform.position = player.position + offset + shake;. - Dans
Shake(), tant queelapsed < duration:shake = Random.insideUnitSphere * strength;, ajouteTime.deltaTimeàelapsed, puisyield return null;. - 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
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser8La caméra
Suivi fluideCaméra orbitaleAnticipationTremblement de la caméraRécapitulatif : caméra de poursuite3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity