Menu
CoddyTech

Sanft drehen

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 45 von 71.

Wird transform.rotation direkt auf eine neue Rotation gesetzt, dreht sich ein Objekt in einem einzigen Frame. Quaternion.RotateTowards(current, goal, maxDegrees) gibt current zurück, in Richtung goal um höchstens maxDegrees gedreht und niemals über das Ziel hinaus. Mit turnSpeed * Time.deltaTime als Schritt dreht sich das Objekt mit gleichmäßiger Geschwindigkeit und stoppt genau an seinem Ziel, so wie MoveTowards bei Positionen. Diese Sonnenblume folgt der Sonne mit 30 Grad pro Sekunde:

public Transform sun;
public float turnSpeed = 30f;

void Update()
{
    Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}

Bei einer 90 Grad entfernten Sonne braucht die Sonnenblume 3 Sekunden, jeweils 30 Grad. Sie dreht sich auf dem kürzesten Weg, und das Ziel wird in jedem Frame erneut ermittelt, sodass sie einer bewegten Sonne folgt.

Quaternion.Slerp(a, b, t) ist die Rotation um den Anteil t des Weges von a nach b, so wie Vector3.Lerp für Punkte. Wird die Funktion in Update() als Slerp(transform.rotation, goal, 5f * Time.deltaTime) geschrieben, dreht sich das Objekt in jedem Frame um einen Anteil des verbleibenden Winkels: zuerst schnell, nahe am Ziel immer langsamer, niemals mit fester Geschwindigkeit und niemals ganz bis zum Ziel. Diese sanfte Bewegung eignet sich für eine Kamera oder einen sich drehenden Kopf. Wenn die Drehgeschwindigkeit eine Spielregel ist, etwa bei einer Kanone, die sich um 60 Grad pro Sekunde dreht, verwende RotateTowards.

challenge icon

Aufgabe

Mittel

Lass die Eule sich sanft in die Richtung drehen, in die jeder Pfeil zeigt.

  1. Füge Quaternion goal; hinzu und setze es in Start() auf transform.rotation.
  2. Setze bei Input.GetKeyDown für jeden Pfeil goal, zum Beispiel goal = Quaternion.LookRotation(Vector3.right);: nach oben +z, nach rechts +x, nach unten -z, nach links -x.
  3. Setze in jedem Frame transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.

Drücke „Spielen“ und tippe auf die Pfeile. Klicke dann auf „Prüfen“.

Probier es selbst

using UnityEngine;

public class Owl : MonoBehaviour
{
    public float turnSpeed = 180f;

    void Update()
    {
        // Oben, rechts, unten, links: Drehe dich mit turnSpeed Grad pro Sekunde in Richtung +z, +x, -z, -x.
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground