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.
Aufgabe
EinfachLass eine Tür mehrere Schlüsselkarten benötigen und den Schlüsselbund mehrere enthalten.
- Setze in
KeyRing.cs[System.Flags]überAccessund nummeriere es mitNone = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)behält die bereits vorhandenen Karten bei:cards |= card;.Opens(Access needs)gibt nur dann true zurück, wenn der Schlüsselbund alle Karten inneedsenthä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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground