Kuaternion
Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 41 dari 63.
Quaternion adalah tipe Unity untuk rotasi: transform.rotation adalah salah satunya, begitu juga nilai yang dikembalikan oleh Quaternion.Euler. Keempat angkanya, x, y, z, dan w, bukan sudut, dan kamu tidak perlu mengaturnya sendiri. Untuk mengolah rotasi, kamu mengalikannya. Rotasi yang dikalikan dengan vektor akan memutar vektor tersebut:
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);Rotasi harus berada di sebelah kiri: Vector3.forward * transform.rotation tidak bisa dikompilasi. Baris ketiga memutar offset sesuai rotasi objek itu sendiri, jadi lamp adalah titik 1 unit di atas dan 2 unit di depan objek, mengikuti arah objek itu sendiri, ke mana pun objek menghadap.
Rotasi yang dikalikan dengan rotasi akan menggabungkan kedua putaran. transform.rotation * Quaternion.Euler(0, 90, 0) menerapkan rotasi objek, lalu memutarnya seperempat putaran pada sumbu y milik objek itu sendiri. Jika urutannya dibalik, seperempat putaran terjadi pada sumbu y dunia. Untuk objek yang tegak, keduanya menghasilkan hasil yang sama. Untuk pesawat yang miring 30 derajat, hasilnya berbeda karena sumbu y-nya sendiri ikut miring:
Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0); // hidung (0.87, 0.5, 0): naik saat berbelok
Quaternion world = Quaternion.Euler(0, 90, 0) * banked; // hidung (1, 0, 0): tetap mendatarQuaternion.identity berarti tidak ada putaran sama sekali, seperti yang kamu berikan ke Instantiate. Mengalikannya dengan nilai ini tidak mengubah apa pun, dan transform.rotation = Quaternion.identity; mengembalikan objek ke pose tanpa putaran.
Tantangan
SedangSenjata berputar dengan panah kiri dan kanan, sedangkan Space menembakkan satu peluru lurus ke depan. Ubah agar Space menembakkan tiga peluru yang menyebar: satu lurus ke depan, satu berbelok spread (20) derajat ke kanan dari arah hadap senjata, dan satu lagi 20 derajat ke kiri. Sebaran peluru harus ikut berputar bersama senjata.
- Setiap peluru menghadap ke arahnya sendiri (script Bullet yang sudah tersedia menerbangkannya ke arah depannya).
- Setiap peluru mulai pada jarak 1 unit dari pusat senjata, menjauh ke arah masing-masing.
Tekan Play, putar dan tembak, lalu tekan Check.
Coba sendiri
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))
{
// Satu peluru melaju lurus ke depan. Tembakkan tiga peluru pada sudut -spread, 0, dan spread derajat.
Instantiate(bulletPrefab, transform.position, transform.rotation);
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Fisika dan Gameplay
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa Hancur