Kamerawackeln
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 48 von 63.
Ein Kamerawackeln ist eine kurze Folge zufälliger Versätze: 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 eignet sich dafür, weil sie über mehrere Frames läuft 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 ein zufälliger Versatz von bis zu strength Länge in eine beliebige Richtung, und yield return null wählt im nächsten Frame einen neuen aus. Wenn bei jedem Durchlauf Time.deltaTime addiert wird, werden reale Sekunden gezählt, sodass das Wackeln bei jeder Bildrate duration lang dauert. Die letzte Zeile bringt die Kamera zurück; ohne sie bleibt die Kamera dort, wohin sie der letzte Versatz bewegt hat.
In jedem Frame führt Unity zuerst jedes Update() aus, dann die Coroutinen, die auf yield return null warten, und anschließend jedes LateUpdate(). Eine Verfolgungskamera, die ihre Position in LateUpdate() setzt, überschreibt also alle Änderungen durch das Wackeln. Das Wackeln von localPosition vermeidet das, wenn die Kamera das Kindobjekt eines leeren Objekts ist, das die Verfolgung übernimmt: Das übergeordnete Objekt bewegt sich, und die Kamera wackelt an ihrer Position darunter.
Aufgabe
MittelDiese Kamera folgt dem Spieler (die Pfeile bewegen sie): In LateUpdate() befindet sie sich an der Position des Spielers plus offset und ist kein untergeordnetes Objekt. Sorge dafür, dass sie wackelt, während sie dem Spieler folgt:
- Mit der Leertaste wackelt sie
duration(0.4) Sekunden lang. In jedem Frame des Wackelns befindet sich die Kamera an einer neuen zufälligen Position, die höchstensstrength(0.3) von ihrer Folgeposition entfernt ist, während sie dem Spieler weiterhin folgt. - Wenn das Wackeln endet, befindet sie sich wieder genau an ihrer Folgeposition.
Die Leertaste startet bereits die Coroutine Shake(). Drücke Play, bewege dich und drücke die Leertaste, dann Check.
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 weg.
yield return null;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand