Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Questa 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 massimo strength (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;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay