Vibrazione della telecamera
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 50 di 71.
Una vibrazione è una breve sequenza di spostamenti casuali: per alcuni decimi di secondo la telecamera si trova in un punto casuale vicino alla posizione di riposo, uno nuovo a ogni fotogramma, e poi torna indietro. Una coroutine è adatta perché viene eseguita su più fotogrammi e termina da sola. Questa telecamera vibra quando atterra un masso (un altro script chiama BoulderLanded(); il file inizia con using System.Collections; per 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 è uno spostamento casuale lungo al massimo strength in qualsiasi direzione, e yield return null ne sceglie uno nuovo al fotogramma successivo. Aggiungere Time.deltaTime a ogni iterazione conta i secondi effettivi, quindi la vibrazione dura duration a qualsiasi frequenza dei fotogrammi. L'ultima riga riporta indietro la telecamera; senza di essa, la telecamera resta nel punto in cui l'ha lasciata l'ultimo spostamento.
A ogni fotogramma Unity esegue tutti gli Update(), poi le coroutine in attesa di yield return null, poi tutti i LateUpdate(). Quindi, una telecamera che segue e imposta la propria posizione in LateUpdate() sovrascrive qualsiasi effetto della vibrazione. Far vibrare localPosition evita questo problema quando la telecamera è figlia di un oggetto vuoto che si occupa di seguirla: il genitore si sposta e la telecamera vibra attorno alla propria posizione al suo interno.
Sfida
MedioFai tremare la seguente telecamera premendo Spazio.
- Aggiungi un campo
Vector3 shake;e, inLateUpdate(), impostatransform.position = player.position + offset + shake;. - In
Shake(), finchéelapsed < duration:shake = Random.insideUnitSphere * strength;, aggiungiTime.deltaTimeaelapseded eseguiyield return null;. - Dopo il ciclo, imposta
shake = Vector3.zero;.
Premi «Gioca», corri e premi Spazio: la visuale trema mentre ti segue. Poi premi «Verifica».
Provalo tu
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()
{
// Fai tremare la telecamera per duration secondi, allontanandola dalla posizione di inseguimento al massimo di strength.
yield return null;
}
}
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere8La telecamera
Inseguimento fluidoTelecamera orbitaleSguardo in avantiVibrazione della telecameraRipasso: telecamera d'inseguimentoEsercitati da solo: Playground Unity