Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Baza 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 przez needs.

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;
    }
}
quiz iconSprawdź się

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