Wyliczenia w Inspectorze
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 17 z 50.
Pole typu enum jest wyświetlane w Inspectorze jako lista rozwijana, co sprawia, że to wygodny sposób konfigurowania obiektów korzystających z tego samego skryptu. Jeden prefab Pickup służy jako monety, serca i tarcze: każda kopia na poziomie pobiera swój rodzaj z listy rozwijanej, a skrypt reaguje na jego wartość:
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);
}
}Scena zapisuje każdy wybór jako liczbę przypisaną do danej wartości: Coin to 0, Heart to 1, Shield to 2. Dodanie wartości na końcu jest bezpieczne. Wstawienie jej na początku, jak w { Gem, Coin, Heart, Shield }, przesuwa wszystkie liczby i zmienia rodzaj każdego przedmiotu Pickup na każdej scenie. Zmiana nazwy wartości jest bezpieczna, ponieważ jej liczba pozostaje taka sama. Zapisanie liczb jawnie, Coin = 0, Heart = 1, Shield = 2, pozwala później zmienić kolejność nazw bez zmiany żadnego zapisanego wyboru.
Enum z atrybutem [System.Flags] przechowuje kilka wartości jednocześnie. Jego lista rozwijana ma pole wyboru przy każdej wartości, a także opcje Nothing i Everything. Każda wartość potrzebuje własnego bitu, więc liczby są potęgami dwójki:
[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }
public Element immuneTo; // zaznaczone w Inspector: Fire i Poison
public void Hit(int damage, Element element)
{
if (immuneTo.HasFlag(element)) return;
hp -= damage;
}Operator | łączy wartości: Element.Fire | Element.Poison to 5. HasFlag(x) zwraca true, gdy ustawiona jest każda wartość w x, a ToString() wyświetla ustawione wartości, na przykład Fire, Poison.
Wyzwanie
ŁatwyBaza ma troje drzwi: do magazynu potrzebna jest czerwona karta, do laboratorium niebieska, a do skarbca obie. W Inspectorze ustaw wartości needs dla każdych drzwi i card dla każdej karty za pomocą enuma Access. Pliki Door.cs i Keycard.cs są gotowe. Strzałkami poruszasz Playerem, którego KeyRing przechowuje zebrane karty. Dokończ KeyRing.cs:
- Utwórz enum
Access, którego wartości można łączyć, aby drzwi mogły wymagać kilku kart, a brelok mógł przechowywać kilka kart. Zachowaj cztery nazwy: None, Red, Blue i Green. Add(Access card)dodaje kartę do breloka, zachowując karty, które już się w nim znajdują.Opens(Access needs)zwraca true, gdy brelok zawiera wszystkie karty określone przezneeds.
Naciśnij Play, wypróbuj drzwi, zbierz karty, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
public enum Access { None, Red, Blue, Green }
public class KeyRing : MonoBehaviour
{
public Access cards;
public void Add(Access card)
{
// dodaj kartę do breloka, zachowując karty, które już się na nim znajdują
}
public bool Opens(Access needs)
{
// true, gdy brelok zawiera wszystkie karty z needs
return false;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest