Menu
CoddyTech

Enums im Inspector

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

Ein Enum-Feld wird im Inspector als Dropdown angezeigt und ist daher eine praktische Möglichkeit, Objekte einzurichten, die dasselbe Skript verwenden. Ein Pickup-Prefab eignet sich für Münzen, Herzen und Schilde: Jede Kopie im Level erhält ihren Typ über das Dropdown, und das Skript wertet ihn mit einer switch-Anweisung aus:

public enum PickupKind { Coin, Heart, Shield }

public class Pickup : MonoBehaviour
{
    public PickupKind kind;
    public int amount = 1;

    void OnTriggerEnter(Collider other)
    {
        if (!other.TryGetComponent(out PlayerStats stats)) return;
        switch (kind)
        {
            case PickupKind.Coin: stats.coins += amount; break;
            case PickupKind.Heart: stats.hp += amount; break;
            case PickupKind.Shield: stats.shielded = true; break;
        }
        Destroy(gameObject);
    }
}

Die Szene speichert jede Auswahl als Zahl des Werts: Coin ist 0, Heart 1, Shield 2. Einen Wert am Ende hinzuzufügen, ist sicher. Wird einer vorne eingefügt, wie in { Gem, Coin, Heart, Shield }, verschiebt sich jede Zahl, und jedes Pickup in jeder Szene ändert seinen Typ. Einen Wert umzubenennen, ist sicher, da seine Zahl gleich bleibt. Wenn du die Zahlen angibst, Coin = 0, Heart = 1, Shield = 2, kannst du die Namen später neu anordnen, ohne eine gespeicherte Auswahl zu verändern.

Ein [System.Flags]-Enum kann mehrere Werte gleichzeitig enthalten. Sein Dropdown enthält für jeden Wert ein Kontrollkästchen sowie „Nothing“ und „Everything“. Jeder Wert benötigt ein eigenes Bit, deshalb sind die Zahlen Zweierpotenzen:

[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }

public Element immuneTo;   // im Inspector angehakt: Fire und Poison

public void Hit(int damage, Element element)
{
    if (immuneTo.HasFlag(element)) return;
    hp -= damage;
}

| kombiniert Werte: Element.Fire | Element.Poison ist 5. HasFlag(x) ist true, wenn jeder Wert in x gesetzt ist, und ToString() listet die gesetzten Werte auf, etwa Fire, Poison.

challenge icon

Aufgabe

Einfach

Lass eine Tür mehrere Schlüsselkarten benötigen und den Schlüsselbund mehrere enthalten.

  1. Setze in KeyRing.cs [System.Flags] über Access und nummeriere es mit None = 0, Red = 1, Blue = 2, Green = 4.
  2. Add(Access card) behält die bereits vorhandenen Karten bei: cards |= card;.
  3. Opens(Access needs) gibt nur dann true zurück, wenn der Schlüsselbund alle Karten in needs enthält.

Drücke „Spielen“ und sammle beide Karten ein: Der Tresor öffnet sich. Dann „Prüfen“.

Probier es selbst

using UnityEngine;

public enum Access { None, Red, Blue, Green }

public class KeyRing : MonoBehaviour
{
    public Access cards;

    public void Add(Access card)
    {
        // Füge die Karte zum Schlüsselring hinzu, ohne die bereits vorhandenen Karten zu entfernen
    }

    public bool Opens(Access needs)
    {
        // true, wenn der Schlüsselring alle in needs angegebenen Karten enthält
        return false;
    }
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground