Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Lass die folgende Kamera bei Druck auf die Leertaste wackeln.

  1. Füge ein Feld Vector3 shake; hinzu und setze in LateUpdate() transform.position = player.position + offset + shake;.
  2. Solange in Shake() elapsed < duration gilt: shake = Random.insideUnitSphere * strength;, addiere Time.deltaTime zu elapsed und führe yield return null; aus.
  3. 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

Übe selbstständig: Unity-Playground