Menu
CoddyTech

Kuaterniyonlar

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

Bir Quaternion, Unity'de döndürme için kullanılan türdür: transform.rotation bir örnektir ve Quaternion.Euler'ın döndürdüğü değer de öyledir. Dört sayısı x, y, z ve w açı değildir ve bunları kendin ayarlaman gerekmez. Döndürmelerle yaptığın şey çarpmadır. Bir döndürme ile vektörü çarpmak, vektörü döndürür:

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öndürme solda yer alır: Vector3.forward * transform.rotation derlenmez. Üçüncü satır, bir ofseti nesnenin kendi döndürmesiyle döndürür; böylece lamp, nesnenin baktığı yönden bağımsız olarak kendi yönlerine göre nesnenin 1 birim üstünde ve 2 birim önünde bulunan noktadır.

Bir döndürme ile başka bir döndürmeyi çarpmak, iki dönüşü birleştirir. transform.rotation * Quaternion.Euler(0, 90, 0), nesnenin döndürmesini ve ardından kendi y ekseni çevresinde çeyrek dönüşü uygular; sıra değiştirildiğinde çeyrek dönüş dünyanın y ekseni çevresinde olur. Dik duran bir nesne için ikisi 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): yatay kalır

Quaternion.identity, hiç dönüş olmaması demektir; Instantiate'e verdiğin değer de budur. Bununla çarpmak hiçbir şeyi değiştirmez ve transform.rotation = Quaternion.identity; bir nesneyi döndürülmemiş pozuna geri getirir.

challenge icon

Görev

Orta

Silah sol ve sağ ok tuşlarıyla döner, Space ise tam ileriye bir mermi ateşler. Space tuşuna basıldığında bunun yerine üç mermilik bir yelpaze şeklinde ateş etsin: biri tam ileriye, biri silahın baktığı yönün spread (20) derece sağına, diğeri de 20 derece soluna. Yayılma, silahla birlikte dönmelidir.

  • Her mermi kendi yönüne bakar (hazır Bullet betiği onu ileri doğru uçurur).
  • Her mermi, kendi yönü boyunca silahın merkezinden 1 birim uzakta başlar.

Play'e bas, dön ve ateş et, ardından Check'e 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))
        {
            // Tek bir mermi, tam ileriye. Üç tane ateşle: -spread, 0 ve spread derece açılarında.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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