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.
Wyzwanie
ŁatwyNiech drzwi wymagają kilku kart dostępu, a pęk kluczy zawiera kilka kart.
- W pliku
KeyRing.csumieść[System.Flags]nadAccessi przypisz mu wartościNone = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)zachowuje karty, które już są w pęku:cards |= card;.Opens(Access needs)zwraca true tylko wtedy, gdy pęk zawiera wszystkie karty zneeds.
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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity