IDamageable
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 7 dari 64.
Interface adalah daftar method yang dijanjikan akan dimiliki sebuah class, tanpa kode di dalamnya. Class yang tidak memiliki kesamaan lain tetap dapat membuat janji yang sama. Dalam C# sederhana:
interface IGreeter
{
string Greet();
}
class Robot : IGreeter
{
public string Greet() { return "Beep"; }
}
class Cat : IGreeter
{
public string Greet() { return "Meow"; }
}Variabel bertipe IGreeter dapat menyimpan Robot atau Cat, dan greeter.Greet() menjalankan method yang dimilikinya. Class yang mencantumkan IGreeter tetapi tidak memiliki Greet() publik tidak dapat di-compile.
Dalam game, banyak hal dapat menerima kerusakan, tetapi hanya memiliki sedikit kesamaan lain: pemain memiliki poin nyawa, peti hancur saat terkena serangan pertama. Class dasar bersama akan memaksa keduanya menjadi bagian dari satu keluarga. Interface menamai satu hal yang mereka miliki bersama, dan setiap skrip 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 skrip tetap memiliki satu class dasar, MonoBehaviour, lalu mencantumkan interface setelahnya. Interface disimpan di file tersendiri, IDamageable.cs, dan tidak diturunkan dari MonoBehaviour: interface bukan component dan tidak pernah dipasang sendiri pada object. Class yang mencantumkannya harus memiliki TakeDamage(int) publik, atau class itu tidak dapat di-compile.
Apa pun yang memberikan kerusakan 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 pemain dan menghancurkan peti dengan baris yang sama, dan jenis target yang ditambahkan nanti tidak memerlukan perubahan di sini. Unity tidak menampilkan field bertipe interface di Inspector, jadi skrip menyimpan GameObject atau component lalu meminta interface darinya, seperti yang dilakukan fireball.
Tantangan
MudahBuat snowman, bell, dan scarecrow mengimplementasikan IDamageable, agar palu bisa memukul mereka.
Snowman:TakeDamagemengecilkannya sebesar0.25f * amountpada setiap sumbu; jika ukurannya 0.5 atau kurang, hancurkan.Bell: catatDongsekali untuk setiap poin dan tambahkanamountkerings.Scarecrow: hanya pukulan pertama yang menjalankantransform.Rotate(0f, 0f, 90f);.- Di dalam
Slam, panggilTakeDamage(power)pada IDamageable setiap collider, jika ada.
Tekan tombol “Main” dan ayunkan palu ke masing-masing. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity