Menu
CoddyTech

IDamageable

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 7 von 64.

Ein Interface ist eine Liste von Methoden, die eine Klasse zu haben verspricht, ohne dass sie Code enthalten. Klassen, die sonst nichts gemeinsam haben, können dasselbe Versprechen abgeben. In einfachem C#:

interface IGreeter
{
    string Greet();
}

class Robot : IGreeter
{
    public string Greet() { return "Beep"; }
}

class Cat : IGreeter
{
    public string Greet() { return "Meow"; }
}

Eine Variable vom Typ IGreeter kann ein Robot oder eine Cat enthalten, und greeter.Greet() führt die Methode des jeweils enthaltenen Objekts aus. Eine Klasse, die IGreeter aufführt, aber keine öffentliche Greet()-Methode hat, lässt sich nicht kompilieren.

In einem Spiel können viele Dinge Schaden nehmen und haben ansonsten wenig gemeinsam: Der Spieler hat Trefferpunkte, eine Kiste zerbricht beim ersten Treffer. Eine gemeinsame Basisklasse würde sie in dieselbe Familie zwingen. Ein Interface benennt das eine Merkmal, das sie gemeinsam haben, und jedes Skript implementiert es auf seine eigene Weise:

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);
    }
}

Ein Skript hat weiterhin eine Basisklasse, MonoBehaviour, und führt danach Interfaces auf. Das Interface gehört in eine eigene Datei, IDamageable.cs, und leitet sich nicht von MonoBehaviour ab: Es ist keine Komponente und kommt niemals allein auf ein Objekt. Eine Klasse, die es aufführt, muss eine öffentliche TakeDamage(int)-Methode haben, sonst lässt sie sich nicht kompilieren.

Was auch immer den Schaden verursacht, fragt nach dem Interface und nicht nach einer Klasse:

// Fireball.cs
void OnCollisionEnter(Collision collision)
{
    IDamageable target = collision.gameObject.GetComponent<IDamageable>();
    if (target != null)
    {
        target.TakeDamage(3);
    }
    Destroy(gameObject);
}

Der Feuerball verletzt den Spieler und zerbricht Kisten mit denselben Zeilen, und eine später hinzugefügte Art von Ziel erfordert hier keine Änderung. Unity zeigt im Inspector kein Feld eines Interface-Typs an, daher speichern Skripte ein GameObject oder eine Komponente und fragen sie nach dem Interface, wie es der Feuerball tut.

challenge icon

Aufgabe

Einfach

Mache den Schneemann, die Glocke und die Vogelscheuche zu IDamageable, damit der Hammer sie trifft.

  1. Snowman: TakeDamage verkleinert ihn auf jeder Achse um 0.25f * amount; bei 0.5 oder weniger zerstöre ihn.
  2. Bell: Pro Punkt einmal Dong protokollieren und amount zu rings addieren.
  3. Scarecrow: Nur beim ersten Treffer transform.Rotate(0f, 0f, 90f); ausführen.
  4. Rufe in Slam für jeden Collider TakeDamage(power) auf dessen IDamageable auf, falls vorhanden.

Drücke „Spielen“ und schwinge den Hammer gegen jedes Objekt. Drücke anschließend „Prüfen“.

Probier es selbst

using UnityEngine;

public class Snowman : MonoBehaviour
{
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground