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.
Sfida
MedioFai seguire alla telecamera il giocatore in modo fluido da un'altezza fissa.
- Aggiungi un campo
Vector3 velocity;. - In
LateUpdate(), creaVector3 target = new Vector3(player.position.x, height, player.position.z - back);, così un salto non sposta la visuale. - 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
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