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ırQuaternion.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.
Görev
OrtaBoşluk tuşuyla, silahla birlikte dönen üç mermilik bir yayılım ateşle.
Instantiatesatırınıfor (int i = -1; i <= 1; i++)ile değiştir.- Döngünün içine
Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);satırını ekle. - 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
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir DuvarKendi başına pratik yap: Unity playground