Vibrazione della telecamera
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 48 di 63.
Una vibrazione è una breve sequenza di spostamenti casuali: per alcuni decimi di secondo la telecamera si trova in una posizione casuale vicino alla sua posizione di riposo, diversa 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 passaggio conta i secondi reali, quindi la vibrazione dura duration a qualsiasi frequenza dei fotogrammi. L'ultima riga riporta la telecamera indietro; senza di essa, la telecamera rimane nel punto in cui l'ha lasciata l'ultimo spostamento.
A ogni fotogramma Unity esegue ogni Update(), poi le coroutine in attesa di yield return null, quindi ogni LateUpdate(). Perciò una telecamera che segue e imposta la propria posizione in LateUpdate() sovrascrive qualsiasi effetto prodotto dalla vibrazione. Far vibrare localPosition evita questo problema quando la telecamera è figlia di un oggetto vuoto che la fa seguire: il genitore si sposta e la telecamera vibra attorno alla sua posizione sotto di esso.
Sfida
MedioQuesta telecamera segue il giocatore (le frecce la muovono): in LateUpdate() si trova nella posizione del giocatore più offset e non è figlia di alcun oggetto. Aggiungi uno scuotimento che funzioni mentre segue il giocatore:
- La barra spaziatrice la scuote per
duration(0.4) secondi. A ogni fotogramma dello scuotimento, la telecamera si trova in una nuova posizione casuale, distante al massimostrength(0.3) dalla sua posizione di inseguimento, continuando a seguire il giocatore. - Quando lo scuotimento termina, torna esattamente alla sua posizione di inseguimento.
La barra spaziatrice avvia già la coroutine Shake(). Premi Play, corri e premi la barra spaziatrice, quindi premi Check.
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()
{
// Scuoti la telecamera per duration secondi, con uno spostamento massimo di strength rispetto alla sua posizione di inseguimento.
yield return null;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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 rovescia2Collisioni
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'inseguimento