Kąty Eulera
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 40 z 63.
transform.eulerAngles to obrót obiektu opisany trzema kątami w stopniach wokół osi x, y i z. Unity przechowuje obrót jako kwaternion (w następnej lekcji) i za każdym razem, gdy odczytujesz te kąty, ponownie je wylicza, 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); // 350Ustawiasz -10, ale kod odczytuje 350, więc if (transform.eulerAngles.z < -5) nigdy nie jest prawdą. Odczyt może zmienić wszystkie trzy liczby: 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 przyjmuje dowolny kąt: -10, 350 i 710 dają ten sam obrót. Dlatego przechowuj kąt we własnej zmiennej float, zmieniaj go i ograniczaj, a następnie ustawiaj na jego podstawie cały obrót. Ta huśtawka przechyla się za pomocą strzałek i zatrzymuje na 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 części odczytanych kątów. transform.eulerAngles.x = 110; nie kompiluje się (CS1612, tak samo jak w przypadku position.x), a skopiowanie eulerAngles, zmiana x i przypisanie kopii z powrotem oznacza, że punktem wyjścia jest wersja kątów używana przez Unity. Po ustawieniu (100, 0, 0) ta kopia ma wartość (80, 180, 180); dodaj 10 do x, a otrzymasz (90, 180, 180), co obraca obiekt z powrotem do 90 zamiast dalej, do 110.
Wyzwanie
ŚredniKamera bezpieczeństwa na słupie powinna stale obracać się z boku na bok: zaczynając od skierowania na wprost (0 stopni wokół y), obraca się w prawo, zwiększając wartość y, z prędkością speed (30) stopni na sekundę, zawraca przy limit (45), obraca się dalej aż do -limit (-45), ponownie zawraca i tak dalej. Przez cały czas zachowuje nachylenie w dół o tilt (20) stopni wokół x.
Naciśnij Play: wersja początkowa zawraca przy 45, ale przy -45 obraca się dalej. Dowiedz się, dlaczego tak się dzieje, i popraw skrypt, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
public class Sweep : MonoBehaviour
{
public float speed = 30f;
public float limit = 45f;
public float tilt = 20f; // stopni 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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Fizyka i rozgrywka
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur