2. Pada metode Start, panggil metode TakeDamageFromFireball() pertama dengan mengetikkan perintah berikut:
int x = TakeDamageFromFireball();
print("Player health: " + x);
3. Lampirkan skrip ke Kamera Utama dan jalankan scenenya. Perhatikan output di Console. Sekarang panggil metode TakeDamageFromFireball() kedua di Start() dengan mengetik berikut ini (letakkan di bawah bit pertama kode yang Anda ketik; tidak perlu menghapusnya):
int y = TakeDamageFromFireball(25);
print("Player health: " + y);
4. Sekali lagi, jalankan scene dan catat output di Console. Terakhir, panggil metode TakeDamageFromFireball() terakhir di Start() dengan mengetik berikut ini:
int z = TakeDamageFromFireball(30, 50);
print("Player health: " + z);
5. Jalankan scene dan catat hasil akhirnya. Perhatikan bagaimana ketiga metode berperilaku sedikit berbeda satu sama lain. Perhatikan juga bahwa Anda memanggil masing-masing secara khusus, dan versi yang benar dari metode TakeDamageFromFireball() digunakan berdasarkan parameter yang Anda masukkan.
Bantuan Menemukan Kesalahan
Jika Anda mendapatkan kesalahan saat mencoba menjalankan skrip, perhatikan nomor baris dan nomor karakter yang dilaporkan di Konsol, di akhir pesan kesalahan.
Selanjutnya, Anda dapat "membangun" kode Anda di dalam Visual Studio dengan menggunakan Ctrl+Shift+B (Command+Shift+B pada Mac). Saat Anda melakukan ini, Visual Studio memeriksa kode Anda dan menunjukkan kesalahan apa pun dalam konteks, menunjukkan dengan tepat di mana garis bermasalah itu. Cobalah.
Manajer Input, klik Edit > Pengaturan Proyek > Input. Di Manajer Input, Anda dapat melihat berbagai sumbu yang terkait dengan tindakan input yang berbeda. Secara default, ada 18 sumbu input, tetapi Anda dapat menambahkan sumbu sendiri jika diinginkan. Gambar 8.1 menunjukkan Manajer Input default dengan sumbu horizontal diperluas.
Gambar 1.41 Input manager
Manajer Input.
Sementara sumbu horizontal tidak secara langsung mengontrol apa pun (Anda akan menulis skrip untuk melakukannya nanti), itu menunjukkan bahwa player bergerak ke samping.
Tabel 1.6 Properti Sumbu Properti Deskripsi
Name Nama sumbu. Ini adalah bagaimana Anda mereferensikannya dalam kode.
Descriptive Name/
Descriptive Negative Name
Nama verbose untuk sumbu yang akan muncul ke player dalam
konfigurasi game. Negatif adalah nama yang berlawanan. Misalnya: "Ke kiri" dan "Ke kanan" akan menjadi pasangan nama dan nama negatif.
Negative Button/
Positive Button
Tombol yang meneruskan nilai negatif dan positif ke sumbu. Untuk sumbu horizontal, ini adalah panah kiri dan tombol panah kanan.
Alt Negative Button/ Alt Positive Button
Tombol alternatif untuk meneruskan nilai ke sumbu. Untuk sumbu horizontal, ini adalah tombol A dan D.
Gravity Seberapa cepat sumbu kembali ke 0 setelah tombol tidak lagi ditekan.
Dead Nilai di bawah mana input apa pun akan diabaikan. Ini membantu mencegah jittering dengan perangkat joystick.
Sensitivity Seberapa cepat sumbu merespons input.
Snap Saat dicentang, Snap menyebabkan sumbu langsung menuju ke 0 saat arah yang berlawanan ditekan.
Invert Memeriksa properti ini akan membalikkan kontrol.
Type Jenis input. Jenisnya adalah tombol keyboard/mouse, gerakan mouse, dan gerakan joystick.
Axis Sumbu yang sesuai dari perangkat input. Ini tidak berlaku untuk tombol.
Joy Num Joystick mana untuk mendapatkan input. Secara default, properti ini mendapat input dari semua joystick.
Skrip Input
Setelah sumbu Anda diatur di Manajer Input, bekerja dengannya dalam kode menjadi sederhana. Untuk mengakses salah satu input player, Anda akan menggunakan objek Input.
Lebih khusus lagi, Anda akan menggunakan metode GetAxis dari objek Input. GetAxis() membaca nama sumbu sebagai string dan mengembalikan nilai sumbu tersebut. Jadi, jika Anda ingin mendapatkan nilai sumbu horizontal, ketikkan yang berikut ini:
Float hVal = Input.GetAxis("Horizontal");
Dalam kasus sumbu horizontal, jika player menekan tombol panah kiri (atau tombol A), GetAxis() mengembalikan angka negatif. Jika player menekan tombol panah kanan (atau tombol D), metode mengembalikan nilai positif.
Membaca di Input Pengguna
Ikuti langkah-langkah ini untuk bekerja dengan sumbu vertikal dan horizontal dan dapatkan ide yang lebih baik tentang cara menggunakan input player:
1. Buat proyek atau scene baru. Tambahkan skrip bernama PlayerInput ke proyek dan lampirkan skrip ke Kamera Utama.
2. Tambahkan kode berikut ke metode Update di skrip PlayerInput:
Float hVal = Input.GetAxis("Horizontal"); float vVal = Input.GetAxis("Vertical"); if(hVal != 0)
print("Horizontal movement selected: " + hVal); if(vVal != 0) print("Vertical
movement selected: " + vVal);
Kode ini harus dalam Pembaruan agar terus membaca input.
3. Simpan skrip dan jalankan scene. Perhatikan apa yang terjadi di Konsol saat Anda menekan tombol panah. Sekarang cobalah kunci W, A, S, dan D. Jika Anda tidak melihat apa pun, klik di jendela Game dengan mouse dan coba lagi.
Input Kunci Spesifik
Meskipun Anda biasanya ingin berurusan dengan sumbu umum untuk input, terkadang Anda ingin menentukan apakah tombol tertentu telah ditekan. Untuk melakukannya, Anda akan kembali menggunakan objek Input. Namun kali ini, Anda akan menggunakan metode GetKey, yang membaca kode khusus yang sesuai dengan kunci tertentu.
Kemudian mengembalikan true jika kunci saat ini turun atau salah jika kunci saat ini tidak turun.
Untuk menentukan apakah tombol K saat ini ditekan, Anda mengetik berikut ini:
bool isKeyDown = Input.GetKey(KeyCode.K);
Menemukan Kode Kunci
Setiap kunci memiliki kode kunci tertentu. Anda dapat menentukan kode kunci dari kunci tertentu yang Anda inginkan dengan membaca dokumentasi Unity. Atau, Anda dapat menggunakan alat bawaan Visual Studio untuk menemukannya. Setiap kali Anda mengerjakan skrip di Visual Studio, Anda selalu dapat mengetikkan nama objek yang diikuti dengan titik.
Ketika Anda melakukannya, menu dengan semua opsi yang mungkin muncul. Demikian juga, jika Anda mengetikkan kurung buka setelah mengetikkan nama metode, menu yang sama akan muncul, menunjukkan kepada Anda berbagai opsi. Gambar 8.2 mengilustrasikan penggunaan menu pop-up ini untuk menemukan kode kunci untuk tombol Esc.
Gambar 1.42 Pop up otomatis di Visual Studio
Membaca dalam Penekanan Tombol Tertentu
Ikuti langkah-langkah berikut untuk menulis skrip yang menentukan apakah tombol tertentu ditekan:
1. Buat proyek atau scene baru. Tambahkan ke proyek skrip bernama PlayerInput (atau ubah yang sudah ada) dan lampirkan ke Kamera Utama.
2. Tambahkan kode berikut ke metode Update di skrip PlayerInput:
if(Input.GetKey(KeyCode.M))
print("The 'M' key is pressed down");
if(Input.GetKeyDown(KeyCode.O)) print("The 'O' key was pressed");
3. Simpan skrip dan jalankan scene. Perhatikan apa yang terjadi saat Anda menekan tombol M versus apa yang terjadi saat Anda menekan tombol O. Secara khusus, perhatikan bahwa tombol M menyebabkan output sepanjang waktu ditahan, sedangkan tombol O hanya mengeluarkan output saat pertama kali ditekan.
“Harus Bangun untuk Turun”
Dalam latihan Coba Sendiri “Membaca dengan Penekanan Tombol Tertentu”, Anda memeriksa input tombol dengan dua cara berbeda. Yaitu, Anda menggunakan Input.GetKey() untuk menguji apakah tombol ditekan sama sekali. Anda juga menggunakan Input.GetKeyDown() untuk menguji apakah tombol ditekan selama frame ini. Versi kedua ini hanya terdaftar saat pertama kali tombol ditekan dan mengabaikan Anda yang menahan tombol. Secara umum, Unity mencari tiga jenis peristiwa penekanan tombol: GetKey(), GetKeyDown(), dan GetKeyUp(). Ini juga konsisten di seluruh metode serupa lainnya:
GetButton(), GetButtonDown(), GetButtonUp(), GetMouseButton(), GetMouseButtonDown(), dan seterusnya. Mengetahui kapan harus mencari penekanan tombol pertama versus tombol yang ditahan adalah penting. Apapun jenis input yang Anda butuhkan, ada metode untuk itu.
Input Mouse
Selain menangkap penekanan tombol, Anda ingin menangkap input mouse dari pengguna. Ada dua komponen untuk input mouse: penekanan tombol mouse dan gerakan mouse. Menentukan apakah tombol mouse ditekan sama seperti mendeteksi penekanan tombol, dibahas lebih awal jam ini. Di bagian ini, Anda akan kembali menggunakan objek Input.
Kali ini Anda akan menggunakan metode GetMouseButtonDown, yang mengambil bilangan bulat antara 0 dan 2 untuk menentukan tombol mouse mana yang Anda tanyakan. Metode mengembalikan nilai Boolean yang menunjukkan apakah tombol ditekan. Kode untuk menekan tombol mouse terlihat seperti ini:
bool isButtonDown;
isButtonDown = Input.GetMouseButtonDown(0); // left mouse button isButtonDown = Input.GetMouseButtonDown(1); // right mouse button isButtonDown = Input.GetMouseButtonDown(2); // center mouse button
Gerakan mouse hanya sepanjang dua sumbu: x dan y. Untuk mendapatkan gerakan mouse, Anda menggunakan metode GetAxis dari objek input. Anda dapat menggunakan nama Mouse X dan Mouse Y untuk mendapatkan gerakan di sepanjang sumbu x dan sumbu y, masing - masing. Kode untuk dibaca dalam gerakan mouse akan terlihat seperti ini:
float values;
value = Input.GetAxis("Mouse X"); // x axis movement value = Input.GetAxis("Mouse Y"); // y axis movement
Tidak seperti penekanan tombol, gerakan mouse diukur dengan jumlah gerakan mouse sejak frame terakhir saja. Pada dasarnya, memegang kunci menyebabkan nilai meningkat hingga maksimal pada -1 atau 1 (tergantung apakah itu positif atau negatif). Gerakan mouse, bagaimanapun, umumnya memiliki angka yang lebih kecil karena diukur dan diatur ulang setiap frame.
Membaca Gerakan Mouse
Dalam latihan ini, Anda akan membaca gerakan mouse dan menampilkan hasilnya ke Konsol:
1. Buat proyek atau scene baru. Tambahkan ke proyek skrip bernama PlayerInput (atau ubah yang sudah ada) dan lampirkan ke Kamera Utama.
2. Tambahkan kode berikut ke metode Update di skrip PlayerInput:
float mxVal = Input.GetAxis("Mouse X");
float myVal = Input.GetAxis("Mouse Y");
if(mxVal != 0)
print("Mouse X movement selected: " + mxVal);
if(myVal != 0)
print("Mouse Y movement selected: " + myVal);
3. Simpan skrip dan jalankan scene. Baca Konsol untuk melihat output saat Anda menggerakkan mouse.
Mengakses Komponen Lokal
Seperti yang telah Anda lihat berkali-kali dalam tampilan Inspector, objek terdiri dari berbagai komponen. Selalu ada komponen transformasi, dan secara opsional mungkin ada sejumlah komponen lain, seperti Renderer, Light, dan Camera. Skrip juga merupakan komponen, dan bersama-sama komponen ini memberikan perilaku objek game.
Menggunakan GetComponent
Anda dapat berinteraksi dengan komponen saat runtime melalui skrip. Hal pertama yang harus Anda lakukan adalah mendapatkan referensi ke komponen yang ingin Anda kerjakan. Anda harus melakukan ini di Start() dan menyimpan hasilnya dalam sebuah variabel.
Dengan cara ini, Anda tidak perlu membuang waktu untuk mengulangi operasi yang relatif lambat ini. Metode GetComponent<Type>() memiliki sintaks yang sedikit berbeda dari yang Anda lihat hingga saat ini, menggunakan chevron untuk menentukan jenis yang Anda cari (misalnya, Light, Camera, nama skrip). GetComponent() mengembalikan komponen pertama dari jenis yang ditentukan yang dilampirkan ke objek game yang sama dengan skrip Anda.
Seperti yang disebutkan sebelumnya di jam ini, Anda kemudian harus menetapkan komponen ini ke variabel lokal sehingga Anda dapat mengaksesnya nanti. Inilah cara Anda melakukannya:
Menggunakan GetComponent
Anda dapat berinteraksi dengan komponen saat runtime melalui skrip. Hal pertama yang harus Anda lakukan adalah mendapatkan referensi ke komponen yang ingin Anda kerjakan. Anda harus melakukan ini di Start() dan menyimpan hasilnya dalam sebuah variabel.
Dengan cara ini, Anda tidak perlu membuang waktu untuk mengulangi operasi yang relatif lambat ini. Metode GetComponent<Type>() memiliki sintaks yang sedikit berbeda dari yang Anda lihat hingga saat ini, menggunakan chevron untuk menentukan jenis yang Anda cari (misalnya, Light, Camera, nama skrip). GetComponent() mengembalikan komponen pertama dari jenis yang ditentukan yang dilampirkan ke objek game yang sama dengan skrip Anda.
Seperti yang disebutkan sebelumnya di jam ini, Anda kemudian harus menetapkan komponen ini ke variabel lokal sehingga Anda dapat mengaksesnya nanti. Inilah cara Anda melakukannya:
lightlightComponent; // A variable to store the light component.
Start() {
lightComponent = GetComponent<Light>();
lightComponent.type = LightType.Directional;
}
Setelah Anda memiliki referensi ke suatu komponen, Anda dapat dengan mudah memodifikasi propertinya melalui kode. Anda melakukannya dengan mengetikkan nama variabel yang menyimpan referensi diikuti dengan titik diikuti oleh properti apa pun yang ingin Anda ubah. Pada contoh di atas, Anda mengubah properti tipe komponen cahaya menjadi Directional.
Mengakses Transform
Komponen yang paling sering Anda gunakan adalah komponen transformasi. Dengan mengeditnya, Anda dapat membuat objek bergerak di sekitar layar. Ingatlah bahwa transformasi suatu objek terdiri dari translasi (atau posisinya), rotasinya, dan scalenya.
Meskipun Anda dapat memodifikasinya secara langsung, lebih mudah menggunakan
beberapa opsi bawaan yang disebut metode Translate(), metode Rotate(), dan variabel localScale, seperti yang ditunjukkan di sini:
// Moves the object along the positive x axis.
// The '0f' means 0 is a float (floating point number). It is the way Unity reads floats transform.Translate(0.05f, 0f, 0f);
// Rotates the object along the z axis transform.Rotate(0f, 0f, 1f);
// Scales the object to double its size in all directions transform.localScale = new Vector3(2f, 2f, 2f);
Menemukan Transformasi
Karena setiap objek game memiliki transformasi, tidak perlu melakukan operasi pencarian eksplisit; Anda dapat mengakses transformasi secara langsung seperti di atas. Ini adalah satu-satunya komponen yang bekerja dengan cara ini; sisanya harus diakses menggunakan metode GetComponent.
Karena Translate() dan Rotate() adalah metode, jika kode sebelumnya dimasukkan ke Update(), objek akan terus bergerak sepanjang sumbu x positif sambil diputar di sepanjang sumbu z.
Mengubah Objek
Ikuti langkah-langkah ini untuk melihat kode sebelumnya beraksi dengan menerapkannya ke objek dalam sebuah scene:
1. Buat proyek atau scene baru. Tambahkan kubus ke scene dan posisikan di (0, -1, 0).
2. Buat skrip baru dan beri nama CubeScript. Tempatkan skrip pada kubus. Di Visual Studio, masukkan kode berikut ke metode Pembaruan:
transform.Translate(.05f, 0f, 0f);
transform.Rotate(0f, 0f, 1f);
transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
3. Simpan skrip dan jalankan scene. Anda mungkin perlu pindah ke tampilan Scene untuk melihat gerakan penuh. Perhatikan bahwa efek dari metode Translate() dan Rotate() bersifat kumulatif, dan variabel localScale tidak; localScale tidak terus berkembang.
Mengakses Objek Lain
Sering kali, Anda ingin skrip dapat menemukan dan memanipulasi objek lain dan komponennya. Melakukannya hanyalah masalah menemukan objek yang Anda inginkan dan memanggil komponen yang sesuai. Ada beberapa cara dasar untuk menemukan objek yang tidak lokal ke skrip atau objek yang dilampirkan skrip.
Menemukan Objek Lain
Cara pertama dan termudah untuk menemukan objek lain untuk dikerjakan adalah dengan menggunakan editor. Dengan membuat variabel publik pada level kelas tipe GameObject, Anda cukup menyeret objek yang Anda inginkan ke komponen skrip dalam tampilan Inspector. Kode untuk mengatur ini terlihat seperti ini:
// This is here for reference
public class SomeClassScript : MonoBehaviour {
// This is the game object you want to access public GameObject objectYouWant;
// This is here for reference void Start() { }
}
Setelah Anda melampirkan skrip ke objek game, Anda akan melihat properti di Inspector yang disebut Objek yang Anda Inginkan. Cukup drag objek game apa pun yang Anda inginkan ke properti ini untuk mengaksesnya di skrip.
Gambar 1.43 Properti Obyek yang Anda Inginkan baru di Inspector.
Cara lain untuk menemukan objek game adalah dengan menggunakan salah satu metode Find. Sebagai aturan praktis, jika Anda ingin seorang desainer dapat menghubungkan objek, atau jika itu opsional, maka hubungkan melalui Inspector. Jika memutuskan sambungan akan merusak permainan, maka gunakan metode Temukan. Ada tiga cara utama untuk menemukan menggunakan skrip: menurut nama, menurut tag, dan menurut jenis. Salah satu opsi adalah mencari berdasarkan nama objek. Nama objek adalah apa yang disebut di dalam tampilan Hierarki. Jika Anda mencari objek bernama Cube, kodenya akan terlihat seperti ini:
// This is here for reference
public class SomeClassScript : MonoBehaviour {
// This is the game object you want to access private GameObject target;
// Note this doesn't need to be public if using find.
// This is here for reference void Start() {
target = GameObject.Find("Cube");
} }
Kekurangan dari metode ini adalah hanya mengembalikan item pertama yang ditemukan dengan nama yang diberikan. Jika Anda memiliki beberapa objek Cube, Anda tidak akan tahu yang mana yang Anda dapatkan.
Menemukan Efisiensi
Ketahuilah bahwa menggunakan metode Find() sangat lambat karena ia mencari setiap objek game dalam scene, secara berurutan, hingga menemukan kecocokan. Dalam scene yang sangat besar, jumlah waktu yang dibutuhkan metode ini dapat menyebabkan penurunan framerate yang nyata dalam game Anda. Dianjurkan untuk tidak pernah menggunakan Find() jika Anda dapat menghindarinya. Yang sedang berkata, ada banyak waktu ketika itu diperlukan. Namun, dalam kasus ini, sangat bermanfaat untuk memanggil metode di Start() dan menyimpan hasil temuan dalam variabel untuk digunakan di masa mendatang guna meminimalkan dampak.
Cara lain untuk menemukan objek adalah dengan tag-nya. Tag suatu objek sangat mirip dengan layernya (dibahas sebelumnya pada jam ini). Satu-satunya perbedaan adalah semantik. Layer digunakan untuk kategori interaksi yang luas, sedangkan tag digunakan untuk
identifikasi dasar. Anda membuat tag menggunakan Pengelola Tag (klik Edit > Setelan Proyek >
Tag & Layer). Gambar 8.4 menunjukkan cara menambahkan tag baru ke Tag Manager.
Gambar 1.44 Menambahkan tag baru.
Setelah tag dibuat, cukup terapkan ke objek dengan menggunakan daftar drop-down Tag di tampilan Inspector
Gambar 1.45 Memilih tag.
Setelah tag ditambahkan ke objek, Anda dapat menemukannya dengan menggunakan metode FindWithTag():
// This is here for reference public class SomeClassScript : MonoBehaviour {
// This is the game object you want to access private GameObject target;
// This is here for reference void Start() {
target = GameObject.FindWithTag("MyNewTag");
} }
Ada metode Find() tambahan yang tersedia, tetapi yang dibahas di sini akan bekerja untuk Anda di sebagian besar situasi.
Memodifikasi Komponen Objek
Setelah Anda memiliki referensi ke objek lain, bekerja dengan komponen objek itu hampir sama persis dengan menggunakan komponen lokal. Satu-satunya perbedaan adalah bahwa sekarang, daripada hanya menulis nama komponen, Anda perlu menulis variabel objek dan titik di depannya, seperti:
// This accesses the local component, not what you want transform.Translate(0, 0, 0);
// This accesses the target object, what you want targetObject.transform.Translate(0, 0, 0);
Mengubah Objek Target Ikuti langkah-langkah ini untuk memodifikasi objek target dengan menggunakan skrip:
1. Buat proyek atau scene baru. Tambahkan kubus ke scene dan posisikan di (0, -1, 0).
2. Buat skrip baru dan beri nama TargetCubeScript. Tempatkan skrip di Kamera Utama.
Di Visual Studio, masukkan kode berikut di TargetCubeScript:
// This is the game object you want to access private GameObject target;
// This is here for reference void Start() {
target = GameObject.Find("Cube");
} void Update() {
target.transform.Translate(.05f, 0f, 0f);
target.transform.Rotate(0f, 0f, 1f);
target.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
}
3. Simpan skrip dan jalankan scene. Perhatikan bahwa kubus bergerak meskipun skrip diterapkan ke Kamera Utama.