Euler-Winkel
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 42 von 71.
transform.eulerAngles ist die Rotation eines Objekts als drei Winkel in Grad um x, y und z. Unity speichert die Rotation als Quaternion (in der nächsten Lektion) und berechnet die drei Winkel jedes Mal neu, wenn du sie ausliest, stets als Werte von 0 bis 360. Neige ein Brett um -10 Grad um z und lies den Wert wieder aus:
transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z); // 350Du setzt -10, aber der Code liest 350 aus, deshalb ist if (transform.eulerAngles.z < -5) nie wahr. Beim Auslesen können sich alle drei Zahlen ändern: Setze (100, 0, 0), und du liest (80, 180, 180) aus – dieselbe Ausrichtung, nur anders dargestellt. Quaternion.Euler(x, y, z) funktioniert in die andere Richtung und akzeptiert jeden Winkel: -10, 350 und 710 ergeben dieselbe Rotation. Behalte den Winkel also in einem eigenen float, ändere und begrenze ihn dort und setze die gesamte Rotation anhand dieses Werts. Diese Wippe neigt sich mit den Pfeiltasten und stoppt in beiden Richtungen bei 20 Grad:
public float speed = 40f;
float tilt;
void Update()
{
tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
tilt = Mathf.Clamp(tilt, -20f, 20f);
transform.rotation = Quaternion.Euler(0, 0, tilt);
}Ändere nicht einen Teil der ausgelesenen Winkel. transform.eulerAngles.x = 110; lässt sich nicht kompilieren (CS1612, wie bei position.x), und wenn du eulerAngles kopierst, x änderst und die Kopie wieder zuweist, gehst du von Unitys Version der Winkel aus. Nach dem Setzen von (100, 0, 0) ist diese Kopie (80, 180, 180); addierst du 10 zu x, erhältst du (90, 180, 180), wodurch das Objekt wieder auf 90 statt weiter auf 110 gedreht wird.
Aufgabe
MittelBehebe die Schwenkbewegung der Kamera: Sie dreht bei 45 um, aber nicht bei -45, weil eulerAngles.y -45 als 315 liest.
- Füge das Feld
float angle;hinzu und ersetze die beiden ersten Zeilen vonUpdate()durchangle += direction * speed * Time.deltaTime;. - Behalte die beiden
if-Zeilen bei und setze dann die gesamte Rotation:transform.rotation = Quaternion.Euler(tilt, angle, 0);.
Drücke auf „Spielen“: Die Kamera schwenkt von 45 bis -45 und zurück, nach unten geneigt. Drücke dann auf „Prüfen“.
Probier es selbst
using UnityEngine;
public class Sweep : MonoBehaviour
{
public float speed = 30f;
public float limit = 45f;
public float tilt = 20f; // Grad nach unten, um die x-Achse
float direction = 1f;
void Update()
{
transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
float angle = transform.eulerAngles.y;
if (angle > limit) direction = -1f;
if (angle < -limit) direction = 1f;
}
}
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