Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Diese 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öchstens strength (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;
    }
}
quiz iconTeste dich selbst

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