Sanftes Folgen
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 47 von 71.
Eine Kamera, die in LateUpdate() die Position des Spielers plus einen Versatz übernimmt, macht jeden Ruck des Spielers zu einem Ruck der Ansicht. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) gibt eine Position zurück, die sich target nähert, so wie sich eine gedämpfte Feder bewegt: Sie beschleunigt, wird langsamer, je näher sie dem Ziel kommt, und erreicht es, ohne darüber hinauszuschießen. Diese Kamera folgt dem Spieler aus 3 Einheiten Höhe und 6 Einheiten Abstand nach hinten, mit leichter Verzögerung:
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 übergibt SmoothDamp die Variable selbst statt einer Kopie, damit die Methode sie ändern kann. SmoothDamp speichert die aktuelle Geschwindigkeit der Kamera auf allen drei Achsen in velocity und benötigt sie im nächsten Frame wieder. Deshalb ist sie ein Feld. Wäre sie innerhalb von LateUpdate() deklariert, würde sie in jedem Frame wieder bei null beginnen, und die Kamera würde kriechen – pro Frame etwa ein halbes Prozent der Strecke zurücklegen. Für eine einzelne Zahl, beispielsweise den Zoom einer Kamera, funktioniert Mathf.SmoothDamp genauso, mit einer float-Geschwindigkeit.
smoothTime bestimmt, wie weit die Kamera hinterherhinkt: Bei 0.3 legt sie in 0.3 Sekunden etwa 60 % eines plötzlichen Sprungs zurück und ist nach 1 Sekunde fast am Ziel. Ein kleinerer Wert lässt sie enger folgen. SmoothDamp liest Time.deltaTime selbst aus, daher wird im Aufruf nichts damit multipliziert.
Aufgabe
MittelLass die Kamera dem Spieler aus einer festen Höhe flüssig folgen.
- Füge ein Feld
Vector3 velocity;hinzu. - Erstelle in
LateUpdate()Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, damit ein Hüpfer die Ansicht nicht bewegt. - Setze
transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.
Drücke auf „Spielen“, laufe und hüpfe: Die Kamera folgt mit leichter Verzögerung und wippt nie. Drücke dann auf „Prüfen“.
Probier es selbst
using UnityEngine;
public class TopDownCamera : MonoBehaviour
{
public Transform player;
public float height = 12f;
public float back = 5f;
public float smoothTime = 0.25f;
void LateUpdate()
{
// Bewege die Kamera sanft zur Position über player (x), back Einheiten dahinter (z), auf einer festen Höhe.
}
}
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground