Menu
CoddyTech

Inseguimento fluido

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 47 di 71.

Una telecamera che copia la posizione del giocatore più un offset in LateUpdate() trasforma ogni scossone del giocatore in uno scossone della visuale. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) restituisce una posizione che si avvicina a target come farebbe una molla smorzata: accelera, rallenta man mano che si avvicina al bersaglio e vi arriva senza superarlo. Questa telecamera segue il giocatore da 3 unità più in alto e 6 più indietro, con un leggero ritardo:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref passa a SmoothDamp la variabile stessa invece di una copia, così il metodo può modificarla. SmoothDamp mantiene in velocity la velocità attuale della telecamera su tutti e tre gli assi e ne ha bisogno di nuovo nel fotogramma successivo, perciò è un campo. Se fosse dichiarata dentro LateUpdate(), ripartirebbe da zero a ogni fotogramma e la telecamera avanzerebbe a fatica, percorrendo circa mezzo percento del tragitto per fotogramma. Per un singolo numero, come lo zoom di una telecamera, Mathf.SmoothDamp funziona allo stesso modo con una velocità di tipo float.

smoothTime determina quanto la telecamera rimane indietro: con il valore 0.3, copre circa il 60% di un salto improvviso in 0.3 secondi e dopo 1 secondo è quasi arrivata. Un valore più piccolo la fa seguire più da vicino. SmoothDamp legge Time.deltaTime autonomamente, quindi nella chiamata non si moltiplica nulla per esso.

challenge icon

Sfida

Medio

Fai seguire alla telecamera il giocatore in modo fluido da un'altezza fissa.

  1. Aggiungi un campo Vector3 velocity;.
  2. In LateUpdate(), crea Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, così un salto non sposta la visuale.
  3. Imposta transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

Premi «Gioca», corri e salta: la telecamera ti segue con un leggero ritardo e non oscilla mai. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // Avvicinati gradualmente al punto sopra il player (x), a back unità dietro di esso (z), a un'altezza fissa.
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity