Menu
CoddyTech

Kwaterniony

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

Quaternion to typ Unity reprezentujący obrót: transform.rotation jest jednym z nich, podobnie jak wartość zwracana przez Quaternion.Euler. Jego cztery liczby x, y, z i w nie są kątami i nigdy nie musisz ustawiać ich samodzielnie. Obrótów używa się przez mnożenie. Obrót pomnożony przez wektor obraca ten wektor:

Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward;       // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0);  // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);

Obrót umieszcza się po lewej stronie: Vector3.forward * transform.rotation nie skompiluje się. Trzecia linia obraca przesunięcie zgodnie z obrotem samego obiektu, więc lamp to punkt położony 1 jednostkę nad obiektem i 2 jednostki przed nim, w jego własnych kierunkach, niezależnie od tego, w którą stronę jest zwrócony.

Obrót pomnożony przez obrót łączy oba obroty. transform.rotation * Quaternion.Euler(0, 90, 0) oznacza obrót obiektu, po którym następuje ćwierć obrotu wokół jego własnej osi y; po zamianie kolejności ćwierć obrót odbywa się wokół osi y świata. W przypadku obiektu ustawionego pionowo oba dają ten sam wynik. W przypadku samolotu przechylonego o 30 stopni już nie, ponieważ jego własna oś y również jest nachylona:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // nos (0.87, 0.5, 0): unosi się podczas skrętu
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // nos (1, 0, 0): pozostaje w poziomie

Quaternion.identity oznacza brak obrotu — to właśnie ten obrót przekazujesz do Instantiate. Mnożenie przez niego niczego nie zmienia, a transform.rotation = Quaternion.identity; przywraca obiekt do pozycji bez obrotu.

challenge icon

Wyzwanie

Średni

Działo obraca się za pomocą strzałek w lewo i w prawo, a spacja wystrzeliwuje jeden pocisk prosto przed siebie. Zmień działanie spacji tak, aby wystrzeliwała wachlarz trzech pocisków: jeden prosto przed siebie, jeden obrócony o spread (20) stopni w prawo względem kierunku, w którym skierowane jest działo, i jeden o 20 stopni w lewo. Wachlarz musi obracać się razem z działem.

  • Każdy pocisk jest skierowany w swoim własnym kierunku (gotowy skrypt Bullet porusza nim wzdłuż jego osi forward).
  • Każdy pocisk zaczyna w odległości 1 jednostki od środka działa, wzdłuż własnego kierunku.

Naciśnij Play, obróć działo i strzel, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

public class Gun : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float turnSpeed = 90f;
    public float spread = 20f;

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
        if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Jeden pocisk, prosto przed siebie. Wystrzel trzy: pod kątami -spread, 0 i spread stopni.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka