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.
Aufgabe
MittelLass die Eule sich sanft in die Richtung drehen, in die jeder Pfeil zeigt.
- Füge
Quaternion goal;hinzu und setze es inStart()auftransform.rotation. - Setze bei
Input.GetKeyDownfür jeden Pfeilgoal, zum Beispielgoal = Quaternion.LookRotation(Vector3.right);: nach oben +z, nach rechts +x, nach unten -z, nach links -x. - 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
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