Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Buat snowman, bell, dan scarecrow mengimplementasikan IDamageable, agar palu bisa memukul mereka.

  1. Snowman: TakeDamage mengecilkannya sebesar 0.25f * amount pada setiap sumbu; jika ukurannya 0.5 atau kurang, hancurkan.
  2. Bell: catat Dong sekali untuk setiap poin dan tambahkan amount ke rings.
  3. Scarecrow: hanya pukulan pertama yang menjalankan transform.Rotate(0f, 0f, 90f);.
  4. Di dalam Slam, panggil TakeDamage(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

Latihan sendiri: Playground Unity