Menu
CoddyTech

Kuaterniyonlar

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 43 / 71.

Bir Quaternion, Unity'de bir dönüşü temsil eden türdür: transform.rotation da bir Quaternion'dır, Quaternion.Euler'ın döndürdüğü değer de. x, y, z ve w adlı dört sayı açı değildir ve bunları kendin ayarlaman gerekmez. Dönüşlerle yaptığın işlem çarpmadır. Bir dönüş ile bir vektör çarpıldığında vektör döner:

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

Dönüş solda yer alır: Vector3.forward * transform.rotation derlenmez. Üçüncü satır, bir ofseti nesnenin kendi dönüşüne göre döndürür; böylece lamp, nesnenin hangi yöne baktığından bağımsız olarak, kendi yönlerine göre nesnenin 1 birim yukarısında ve 2 birim önünde bulunan nokta olur.

Bir dönüş ile başka bir dönüş çarpıldığında iki dönüş birleşir. transform.rotation * Quaternion.Euler(0, 90, 0), önce nesnenin dönüşünü, ardından nesnenin kendi y ekseni etrafında çeyrek dönüşü uygular; çarpma sırası değiştirilirse çeyrek dönüş dünyanın y ekseni etrafında gerçekleşir. Dik duran bir nesnede her iki işlem de aynı sonucu verir. 30 derece yatık bir uçakta ise sonuçlar farklıdır; çünkü uçağın kendi y ekseni de onunla birlikte eğilir:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // burun (0.87, 0.5, 0): dönerken yükselir
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // burun (1, 0, 0): aynı seviyede kalır

Quaternion.identity hiç dönüş olmaması demektir; bu, Instantiate'e verdiğin değerdir. Bununla çarpmak hiçbir şeyi değiştirmez ve transform.rotation = Quaternion.identity; bir nesneyi yeniden dönmemiş duruşuna getirir.

challenge icon

Görev

Orta

Boşluk tuşuyla, silahla birlikte dönen üç mermilik bir yayılım ateşle.

  1. Instantiate satırını for (int i = -1; i <= 1; i++) ile değiştir.
  2. Döngünün içine Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0); satırını ekle.
  3. Her mermiyi, yönünde 1 birim uzağa oluştur: Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);.

“Oyna” düğmesine bas, dön ve ateş et: üç mermi 20 derece arayla yelpaze şeklinde yayılır. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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))
        {
            // Bir mermi, doğrudan ileri. Üç mermi ateşle: -spread, 0 ve spread derece açılarla.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}

Fizik ve Oynanış bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground