IDamageable
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 6 dari 50.
Banyak hal dalam game yang bisa terkena damage, dan hanya sedikit kesamaan di antara mereka: player memiliki hit point, sedangkan crate hancur saat terkena hit pertama. Satu base class bersama akan memaksa mereka menjadi satu keluarga. Sebuah interface menyebutkan satu hal yang sama di antara mereka, dan setiap script mengimplementasikannya dengan caranya sendiri:
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}Sebuah script tetap memiliki satu base class, MonoBehaviour, lalu mencantumkan interface setelahnya. Interface diletakkan di file tersendiri, IDamageable.cs, dan tidak diturunkan dari MonoBehaviour: interface bukan component dan tidak pernah dipasang sendiri pada sebuah object. Class yang mencantumkannya harus memiliki TakeDamage(int) yang bersifat public, atau kompilasi akan gagal.
Bagian yang memberikan damage meminta interface, bukan class:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}Fireball melukai player dan menghancurkan crate dengan baris yang sama, dan jenis target yang ditambahkan nanti tidak memerlukan perubahan di sini. Unity tidak menampilkan field bertipe interface di Inspector, jadi script menyimpan GameObject atau component lalu meminta interface darinya, seperti yang dilakukan fireball.
Tantangan
MudahSeorang raksasa menjaga alun-alun desa. Tombol panah menggerakkan Giant (Mover.cs, siap), dan Space mengayunkan palunya: Hammer.cs memanggil Slam(), yang menemukan setiap collider dalam radius. Tiga benda di alun-alun terkena pukulan, masing-masing dengan caranya sendiri, dan tidak berbagi hal lain:
Snowman: setiap poin damage mengurangi ukurannya sebesar 0.25 pada setiap sumbu (ukurannya mulai dari 1.5). Saat ukurannya 0.5 atau kurang, ia meleleh: hancurkan snowman.Bell: mencatatDongsekali untuk setiap poin damage (pukulan dengan damage 2 mencatatnya dua kali) dan menambahkan poin tersebut kerings.Scarecrow: pukulan pertama menjatuhkannya, memutarnya 90 derajat pada sumbu z, berapa pun damagenya. Pukulan berikutnya tidak mengubah apa pun.
IDamageable.cs mendeklarasikan interface dengan satu method: void TakeDamage(int amount). Buat Snowman, Bell, dan Scarecrow mengimplementasikannya, masing-masing dengan reaksinya sendiri. Lalu, di dalam Slam, panggil TakeDamage(power) pada IDamageable dari setiap collider yang ditemukan. Collider yang tidak memilikinya, seperti tanah, dilewati.
Tekan Play, dekati masing-masing benda dan ayunkan palu, lalu tekan Check.
Coba sendiri
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest