Menu
CoddyTech

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);   // 350

Du 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.

challenge icon

Aufgabe

Mittel

Behebe die Schwenkbewegung der Kamera: Sie dreht bei 45 um, aber nicht bei -45, weil eulerAngles.y -45 als 315 liest.

  1. Füge das Feld float angle; hinzu und ersetze die beiden ersten Zeilen von Update() durch angle += direction * speed * Time.deltaTime;.
  2. 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

Übe selbstständig: Unity-Playground