Menu
CoddyTech

Enumy w Inspectorze

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 20 z 64.

Pole wyliczeniowe jest wyświetlane w Inspectorze jako lista rozwijana, co sprawia, że wygodnie można konfigurować obiekty korzystające z tego samego skryptu. Jeden prefabrykowany obiekt Pickup służy do tworzenia monet, serc i tarcz: każda kopia na poziomie otrzymuje swój rodzaj z listy rozwijanej, a skrypt wykonuje odpowiednie działanie zależnie od jego wartości:

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 numer 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 numery i zmienia rodzaj każdego obiektu Pickup w każdej scenie. Zmiana nazwy wartości jest bezpieczna, ponieważ jej numer pozostaje taki sam. Zapisanie numerów jawnie, Coin = 0, Heart = 1, Shield = 2, pozwala później zmieniać kolejność nazw bez zmiany zapisanych wyborów.

Wyliczenie [System.Flags] przechowuje kilka wartości jednocześnie. Na jego liście rozwijanej znajduje się pole wyboru przy każdej wartości, a także opcje Nothing i Everything. Każda wartość musi mieć własny bit, dlatego liczby są potęgami dwójki:

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

public Element immuneTo;   // zaznaczone w Inspectorze: 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 daje 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

Niech drzwi wymagają kilku kart dostępu, a pęk kluczy zawiera kilka kart.

  1. W pliku KeyRing.cs umieść [System.Flags] nad Access i przypisz mu wartości None = 0, Red = 1, Blue = 2, Green = 4.
  2. Add(Access card) zachowuje karty, które już są w pęku: cards |= card;.
  3. Opens(Access needs) zwraca true tylko wtedy, gdy pęk zawiera wszystkie karty z needs.

Naciśnij „Graj” i podnieś obie karty: skarbiec się otworzy. Następnie naciśnij „Sprawdź”.

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 określone przez needs
        return false;
    }
}

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity