Menu
CoddyTech

Kąty Eulera

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 42 z 71.

transform.eulerAngles to obrót obiektu opisany trzema kątami w stopniach wokół osi x, y i z. Unity przechowuje obrót jako kwaternion (poznasz go na następnej lekcji) i za każdym razem, gdy odczytujesz kąty, ponownie je oblicza — zawsze jako wartości od 0 do 360. Przechyl deskę o -10 stopni wokół osi z i odczytaj wartość:

transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z);   // 350

Ustawiasz -10, ale kod odczytuje 350, więc warunek if (transform.eulerAngles.z < -5) nigdy nie jest prawdziwy. Odczytane wartości wszystkich trzech kątów mogą się zmienić: ustaw (100, 0, 0), a odczytasz (80, 180, 180) — tę samą orientację zapisaną w inny sposób. Quaternion.Euler(x, y, z) działa w przeciwnym kierunku i akceptuje dowolny kąt: -10, 350 i 710 dają ten sam obrót. Dlatego przechowuj kąt we własnej zmiennej typu float, zmieniaj go i ograniczaj, a następnie ustawiaj na jego podstawie cały obrót. Ta huśtawka równoważna przechyla się za pomocą strzałek i zatrzymuje przy 20 stopniach w obie strony:

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);
}

Nie zmieniaj pojedynczej wartości odczytanych kątów. transform.eulerAngles.x = 110; się nie kompiluje (CS1612, podobnie jak w przypadku position.x), a skopiowanie eulerAngles, zmiana x i przypisanie kopii z powrotem rozpoczyna od kątów w wersji Unity. Po ustawieniu (100, 0, 0) kopia ma wartości (80, 180, 180); dodaj 10 do x, a otrzymasz (90, 180, 180), co obraca obiekt z powrotem do 90 zamiast dalej do 110.

challenge icon

Wyzwanie

Średni

Napraw ruch obrotowy kamery: zawraca przy 45, ale nie przy -45, ponieważ eulerAngles.y odczytuje -45 jako 315.

  1. Dodaj pole float angle; i zastąp dwa pierwsze wiersze Update() wierszem angle += direction * speed * Time.deltaTime;.
  2. Pozostaw dwa wiersze if, a następnie ustaw cały obrót: transform.rotation = Quaternion.Euler(tilt, angle, 0);.

Naciśnij „Graj”: kamera obraca się od 45 do -45 i z powrotem, pochylona w dół. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class Sweep : MonoBehaviour
{
    public float speed = 30f;
    public float limit = 45f;
    public float tilt = 20f;   // stopnie w dół, wokół osi x
    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;
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity