Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Fai tremare la seguente telecamera premendo Spazio.

  1. Aggiungi un campo Vector3 shake; e, in LateUpdate(), imposta transform.position = player.position + offset + shake;.
  2. In Shake(), finché elapsed < duration: shake = Random.insideUnitSphere * strength;, aggiungi Time.deltaTime a elapsed ed esegui yield return null;.
  3. 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

Esercitati da solo: Playground Unity