Kamerawackeln
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 50 von 71.
Ein Kamerawackeln ist eine kurze Folge zufälliger Verschiebungen: Für einige Zehntelsekunden befindet sich die Kamera an einer zufälligen Stelle nahe ihrer Ruheposition, in jedem Frame an einer neuen, und kehrt dann zurück. Eine Coroutine passt dazu, weil sie sich über mehrere Frames erstreckt und von selbst endet. Diese Kamera wackelt, wenn ein Felsbrocken landet (ein anderes Skript ruft BoulderLanded() auf; die Datei beginnt mit using System.Collections; für 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 ist eine zufällige Verschiebung, die in jede Richtung bis zu strength lang ist, und yield return null wählt im nächsten Frame eine neue aus. Wenn du bei jedem Durchlauf Time.deltaTime addierst, werden echte Sekunden gezählt, sodass das Wackeln bei jeder Bildrate duration lang dauert. Die letzte Zeile setzt die Kamera zurück; ohne sie bleibt die Kamera dort, wohin sie die letzte Verschiebung gebracht hat.
In jedem Frame führt Unity zuerst jedes Update() aus, dann die Coroutines, die auf yield return null warten, und anschließend jedes LateUpdate(). Eine Verfolgungskamera, die ihre Position in LateUpdate() festlegt, überschreibt also alles, was das Wackeln bewirkt hat. Das Wackeln von localPosition vermeidet das, wenn die Kamera ein untergeordnetes Objekt eines leeren Objekts ist, das die Verfolgung übernimmt: Das übergeordnete Objekt bewegt sich, und die Kamera wackelt an ihrer Position darunter.
Aufgabe
MittelLass die folgende Kamera bei Druck auf die Leertaste wackeln.
- Füge ein Feld
Vector3 shake;hinzu und setze inLateUpdate()transform.position = player.position + offset + shake;. - Solange in
Shake()elapsed < durationgilt:shake = Random.insideUnitSphere * strength;, addiereTime.deltaTimezuelapsedund führeyield return null;aus. - Setze nach der Schleife
shake = Vector3.zero;.
Drücke „Spielen“, laufe und drücke die Leertaste: Die Ansicht wackelt, während sie dir folgt. Klicke dann auf „Prüfen“.
Probier es selbst
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()
{
// Schüttle die Kamera für duration Sekunden um bis zu strength von ihrer Folgeposition aus.
yield return null;
}
}
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