• Tidak ada hasil yang ditemukan

RUANG KOORDINAT LOKAL VS. GLOBAL

Dalam dokumen Membuat Video Game Dengan 3D Unity (Halaman 95-100)

MEMULAI DEMO 3D DENGAN CODING DAN MENAMBAHKAN FISIKA

3.5 RUANG KOORDINAT LOKAL VS. GLOBAL

Gambar 3.14 Ilustrasi rotasi pitch, yaw, dan roll pesawat terbang

Mengingat bahwa kita dapat menggambarkan rotasi di sekitar sumbu X-, Y-, dan Z, itu berarti tiga parameter untuk Rotate() adalah rotasi X, Y, dan Z. Karena kami hanya ingin player berputar ke samping, bukan miring ke atas dan ke bawah, seharusnya hanya ada angka yang diberikan untuk rotasi Y, dan hanya 0 untuk rotasi X dan Z. Semoga Anda bisa menebak apa yang akan terjadi jika Anda mengubah parameter menjadi (kecepatan, 0, 0) dan kemudian memainkannya; coba itu sekarang! Ada satu poin penting lainnya yang perlu dipahami tentang rotasi dan sumbu koordinat 3D, yang diwujudkan dalam parameter keempat opsional untuk metode Rotate().

Gambar 3.15 Sumbu koordinat lokal vs. Global

Jika Anda baru mengenal grafik 3D, ini adalah konsep yang membingungkan. Sumbu yang berbeda digambarkan pada Gambar 3.15 (perhatikan bagaimana "kiri" ke pesawat adalah arah yang berbeda dari "kiri" ke dunia) tetapi cara termudah untuk memahami lokal dan global adalah melalui sebuah contoh. Pertama, pilih objek player dan kemudian miringkan sedikit (seperti 30 untuk rotasi X). Ini akan membuang koordinat lokal, sehingga rotasi lokal dan global akan terlihat berbeda. Sekarang coba jalankan skrip Spin baik dengan dan tanpa Space.World ditambahkan ke parameter; jika terlalu sulit bagi Anda untuk memvisualisasikan apa yang terjadi, coba lepaskan komponen putaran dari objek pemutar dan alih-alih rotate kubus miring yang ditempatkan di depan pemutar. Anda akan melihat objek berputar di sekitar sumbu yang berbeda saat Anda mengatur perintah ke koordinat lokal atau global.

Komponen skrip untuk melihat-lihat: MouseLook

Sekarang Anda akan membuat rotasi merespons input dari mouse (yaitu, rotasi objek yang dilampirkan skrip ini, yang dalam hal ini adalah pemutarnya). Anda akan melakukan ini dalam beberapa langkah, secara bertahap menambahkan kemampuan gerakan baru ke karakter. Pertama player hanya akan berputar dari sisi ke sisi, dan kemudian player hanya akan berputar ke atas dan ke bawah. Akhirnya player akan dapat melihat sekeliling ke segala arah (berputar secara horizontal dan vertikal pada saat yang sama), perilaku yang disebut sebagai tampilan mouse. Mengingat bahwa akan ada tiga jenis perilaku rotasi yang berbeda (horizontal, vertikal, dan keduanya), Anda akan mulai dengan menulis kerangka kerja untuk mendukung ketiganya. Buat skrip C# baru, beri nama MouseLook, dan tulis kode dari daftar berikutnya.

Gambar 3.16 Kerangka kerja MouseLook dengan enum untuk pengaturan Rotasi Perhatikan bahwa enum digunakan untuk memilih rotasi horizontal atau vertikal untuk skrip MouseLook. Mendefinisikan struktur data enum memungkinkan Anda untuk menetapkan nilai berdasarkan nama, daripada mengetik angka dan mencoba mengingat apa arti setiap angka (apakah 0 rotasi horizontal? Apakah 1?). Jika Anda kemudian mendeklarasikan variabel publik yang diketik ke enum itu, yang akan ditampilkan di Inspector sebagai menu tarik-turun yang berguna untuk memilih pengaturan.

Gambar 3.17 Inspector menampilkan variabel enum publik sebagai menu tarik-turun.

Hapus komponen Spin (dengan cara yang sama seperti Anda menghapus penumbuk kapsul sebelumnya) dan lampirkan skrip baru ini ke objek pemutar. Gunakan menu Sumbu untuk beralih di antara cabang kode saat mengerjakan kode. Dengan pengaturan rotasi horizontal/vertikal, Anda dapat mengisi kode untuk setiap cabang kondisional.

Rotasi horizontal yang melacak gerakan mouse

Cabang pertama dan paling sederhana adalah rotasi horizontal. Mulailah dengan menulis perintah rotasi yang sama yang Anda gunakan dalam daftar 2.1 untuk membuat objek berputar. Jangan lupa untuk mendeklarasikan variabel publik untuk kecepatan rotasi;

mendeklarasikan variabel baru setelah sumbu tetapi sebelum Update(), dan memanggil variabel sensitivitasHor karena kecepatan terlalu umum nama setelah Anda memiliki beberapa rotasi yang terlibat. Tingkatkan nilai variabel menjadi 9 kali ini karena nilai itu harus lebih besar setelah kode mulai scalingnya (yang akan segera). Kode yang disesuaikan akan terlihat seperti daftar berikut.

Gambar 3.18 Rotasi horizontal, belum merespons mouse

Jika Anda memutar skrip sekarang, tampilan akan berputar seperti sebelumnya (hanya jauh lebih cepat, karena rotasi Y adalah 9 bukannya 3). Langkah selanjutnya adalah membuat rotasi bereaksi terhadap gerakan mouse, jadi mari kita perkenalkan metode baru:

Input.GetAxis(). Kelas Input memiliki banyak metode untuk menangani perangkat input (seperti mouse) dan metode GetAxis() mengembalikan angka yang berkorelasi dengan pergerakan mouse (positif atau negatif, tergantung pada arah gerakan). GetAxis() mengambil nama sumbu yang diinginkan sebagai parameter, dan sumbu horizontal disebut Mouse X.

Jika Anda mengalikan kecepatan rotasi dengan nilai sumbu, rotasi akan merespons gerakan mouse. Kecepatan akan meningkat sesuai dengan gerakan mouse, menurun ke nol atau bahkan membalikkan arah. Perintah Rotate sekarang terlihat seperti daftar berikutnya.

Gambar 3.19 Putar perintah yang disesuaikan untuk merespons mouse

Tekan Mainkan lalu gerakkan mouse. Saat Anda menggerakkan mouse dari sisi ke sisi, tampilan akan berputar dari sisi ke sisi. Itu sangat keren! Langkah selanjutnya adalah memutar secara vertikal, bukan horizontal.

Rotasi vertikal dengan batas

Untuk rotasi horizontal kami telah menggunakan metode Rotate(), tetapi kami akan mengambil pendekatan yang berbeda dengan rotasi vertikal. Meskipun metode itu nyaman untuk menerapkan transformasi, itu juga agak tidak fleksibel. Ini hanya berguna untuk meningkatkan rotasi tanpa batas, yang baik untuk rotasi horizontal, tetapi rotasi vertikal membutuhkan batasan seberapa banyak tampilan dapat dimiringkan ke atas atau ke bawah.

Daftar berikut menunjukkan kode rotasi vertikal untuk MouseLook; penjelasan rinci tentang kode akan datang setelahnya.

Gambar 3.20 Rotasi vertikal untuk MouseLook

Atur menu Axes dari komponen MouseLook ke rotasi vertikal dan mainkan skrip baru.

Sekarang tampilan tidak akan berputar ke samping, tetapi akan miring ke atas dan ke bawah saat Anda menggerakkan mouse ke atas dan ke bawah. Kemiringan berhenti di batas atas dan bawah.

Ada beberapa konsep baru dalam kode ini yang perlu dijelaskan. Pertama, kita tidak menggunakan Rotate() kali ini, jadi kita memerlukan variabel (disebut _rotationX di sini, karena rotasi vertikal mengelilingi sumbu X) untuk menyimpan sudut rotasi. Metode Rotate() menambah rotasi saat ini, sedangkan kode ini menetapkan sudut rotasi secara langsung.

Dengan kata lain, ini adalah perbedaan antara mengatakan "tambahkan 5 ke sudut" dan "atur sudut ke 30." Kita masih perlu menaikkan sudut rotasi, tapi itulah mengapa kode memiliki operator -=: untuk mengurangi nilai dari sudut rotasi, daripada mengatur sudut ke nilai itu.

Dengan tidak menggunakan Rotate() kita dapat memanipulasi sudut rotasi dengan berbagai cara selain hanya menambahnya. Nilai rotasi dikalikan dengan Input.GetAxis() seperti pada kode untuk rotasi horizontal, kecuali sekarang kita meminta Mouse Y karena itu adalah sumbu vertikal mouse.

Sudut rotasi dimanipulasi lebih lanjut pada baris berikutnya. Kami menggunakan Mathf.Clamp() untuk menjaga sudut rotasi antara batas minimum dan maksimum. Batasan tersebut adalah variabel publik yang dideklarasikan sebelumnya dalam kode, dan mereka memastikan bahwa tampilan hanya dapat dimiringkan 45 derajat ke atas atau ke bawah.

Metode Clamp() tidak khusus untuk rotasi, tetapi umumnya berguna untuk menjaga variabel angka di antara batas. Untuk melihat apa yang terjadi, coba komentari baris Clamp(); sekarang kemiringan tidak berhenti di batas atas dan bawah, memungkinkan Anda bahkan memutar sepenuhnya terbalik! Jelas, melihat dunia secara terbalik tidak diinginkan; oleh karena itu batas-batasnya. Karena properti sudut dari transformasi adalah Vektor3, kita perlu membuat Vektor3 baru dengan sudut rotasi yang diteruskan ke konstruktor. Metode Rotate() mengotomatiskan proses ini untuk kami, menambah sudut rotasi dan kemudian membuat vektor baru.

Definisi Vektor adalah beberapa angka yang disimpan bersama sebagai satu kesatuan.

Misalnya, Vektor3 adalah 3 angka (berlabel x, y, z). Peringatan Alasan mengapa kita perlu membuat Vector3 baru alih-alih mengubah nilai dalam vektor yang ada dalam transformasi

adalah karena nilai tersebut hanya-baca untuk transformasi. Ini adalah kesalahan umum yang dapat membuat Anda tersandung.

Dalam dokumen Membuat Video Game Dengan 3D Unity (Halaman 95-100)