Enums im Inspector
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 17 von 50.
Ein Enum-Feld wird im Inspector als Dropdown angezeigt. Das ist praktisch, um Objekte einzurichten, die dasselbe Skript verwenden. Ein Pickup-Prefab dient für Münzen, Herzen und Schilde: Jede Kopie im Level erhält ihre Art über das Dropdown, und das Skript verzweigt danach:
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 Zahlenwert des Enum-Werts: Coin ist 0, Heart 1, Shield 2. Einen Wert am Ende hinzuzufügen, ist sicher. Wird einer am Anfang eingefügt, wie in { Gem, Coin, Heart, Shield }, verschiebt sich jede Zahl, und jedes Pickup in jeder Szene ändert seine Art. Einen Wert umzubenennen, ist sicher, da seine Zahl gleich bleibt. Wenn du die Zahlen explizit angibst, also Coin = 0, Heart = 1, Shield = 2, kannst du die Namen später neu anordnen, ohne eine gespeicherte Auswahl zu ändern.
Ein Enum mit [System.Flags] kann mehrere Werte gleichzeitig enthalten. Sein Dropdown hat ein Häkchen pro Wert sowie „Nichts“ und „Alles“. Jeder Wert braucht ein eigenes Bit, daher 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.
Aufgabe
EinfachDie Basis hat drei Türen: Für den Lagerraum wird die rote Schlüsselkarte benötigt, für das Labor die blaue und für den Tresor beide. needs jeder Tür und card jeder Karte werden im Inspector mit dem Enum Access festgelegt, und Door.cs und Keycard.cs sind fertig. Mit den Pfeiltasten bewegst du den Player, dessen KeyRing die aufgesammelten Karten enthält. Vervollständige KeyRing.cs:
- Mach
Accesszu einem Enum, dessen Werte kombiniert werden können, sodass eine Tür mehrere Karten benötigen und der Schlüsselring mehrere Karten enthalten kann. Behalte die vier Namen bei: None, Red, Blue und Green. Add(Access card)fügt dem Schlüsselring eine Karte hinzu und behält die bereits vorhandenen Karten bei.Opens(Access needs)gibt true zurück, wenn der Schlüsselring alle inneedsenthaltenen Karten hat.
Drücke Spielen, probiere die Türen aus, sammle die Karten auf und klicke dann auf 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 dem Schlüsselring hinzu und behalte die bereits vorhandenen Karten bei
}
public bool Opens(Access needs)
{
// true, wenn der Schlüsselring alle in needs angegebenen Karten enthält
return false;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest