Mam system czarów, który tworzę, zasada jest następująca:
- Każde zaklęcie jest autonomicznym prefabrykatem. Zawiera skrypt z niektórymi właściwościami (obrażenia podstawowe, czas trwania ...), które można modyfikować w inspektorze.
- Mam wyliczenie zaklęcia z listą wszystkich możliwych zaklęć w kodzie, które są używane w logice gry
- Kiedy chcę rzucić zaklęcie, muszę mieć prefabrykację tego zaklęcia, aby utworzyć jego instancję i przeczytać jej informacje
- Każdy aktor (gracze lub wrogowie) musi mieć listę możliwych animacji zaklęć
Problemy z tym, jak próbuję wdrożyć, to:
- Aby wyświetlić listę animacji każdego aktora, mógłbym użyć
Dictionary<Spell, Animation>
, ale inspektor nie obsługuje słowników, co utrudnia łatwą edycję typu wielu aktorów. - Potrzebuję sposobu, aby łatwo uzyskać dostęp do prefabrykacji zaklęcia z odpowiedniego wyliczenia. Tutaj także mogę użyć słownika, ale mogę odwoływać się tylko do prefabrykatów w inspektorze, a nie do kodu, co oznacza, że nie będę w stanie wypełnić tego słownika
Szukam sposobu, aby łatwo powiązać moje wyliczenia zaklęć z odpowiednimi prefabrykatami i animacjami
unity
architecture
rpg
data-structure
editors
Malharhak
źródło
źródło
Odpowiedzi:
Jednym szybkim sposobem na uzyskanie par klucz-wartość w inspektorze Unity jest zdefiniowanie możliwej do serializacji klasy wejściowej, a następnie użycie ich tablicy lub listy <>. na przykład...
Automatycznie da to listę kontrolera, której rozmiar można zmienić, w której można wprowadzić klucz i wartość, bez konieczności pisania niestandardowego inspektora.
Wynik wygląda następująco:
(Jedna sztuczka: jeśli serializowana klasa wejściowa zawiera pole „Nazwa”, ten ciąg zostanie wyświetlony zamiast nijakich nagłówków „Element 0”. Przydatne, jeśli masz bardziej złożone dane, aby móc efektywnie nawigować.)
Uczynienie tego ScriptableObject pozwala traktować go jako Zasób współdzielony między typami encji / instancjami, które wymagają tego samego zestawu animacji, unikając narzucania się duplikacji listy dla każdego z nich. (Inne klasy są zazwyczaj serializowane na instancję w Unity). Aby przejść tę trasę, musisz dodać mały skrypt edytora, aby umożliwić tworzenie ich instancji w folderze Zasoby .
Edycja: teraz jest jeszcze łatwiej - możesz po prostu dodać ten atrybut nad ScriptableObject:
Spowoduje to umieszczenie obiektu ScriptableObject w menu Utwórz, na przykład:
Opcjonalnie możesz ustawić tablicę jako prywatną i zserializowaną, aby nadal wyświetlała się w inspektorze, ale dodać publiczny Słownik (lub słownik prywatny z publiczną metodą GetAnimation (pisownia)), aby klienci mogli z niego korzystać w celu bardziej wydajnego wyszukiwania. W metodzie OnEnable () SpellAnimationMap może iterować przez tablicę wypełnioną inspektorem, aby zbudować ten słownik ponownie, ponownie dzieląc korzyści między wszystkimi instancjami klienta. (Zauważ, że OnEnable () jest także wywoływany w edytorze, gdy zasób jest tworzony po raz pierwszy, więc upewnij się, że tablica nie ma wartości null, zanim spróbujesz go odczytać)
Na koniec możesz dodać tyle danych wejściowych, ile potrzebujesz. Może na przykład obejmować prefabrykaty lub dowolną liczbę innych bitów danych, które chcesz połączyć z kluczem pisowni.
Możliwe jest również pisanie niestandardowych inspektorów, aby bezpośrednio wypełniać pola Dictionary <,>, ale mam wrażenie, że dziwnie jest pracować płynnie.
źródło
Przeczytaj wyjaśnienie dostarczone przez @DMGregory
Dla tych, którzy lubią przykłady:
źródło