Ich habe ein Rechtschreibsystem, das ich erstelle. Das Prinzip ist wie folgt:
- Jeder Spruch ist ein autonomes Fertighaus. Es enthält ein Skript mit einigen Eigenschaften (Grundschaden, Dauer ...), die im Inspektor geändert werden können.
- Ich habe eine Spell-Enumeration, die alle möglichen Zaubersprüche im Code auflistet, der in der Spielelogik verwendet wird
- Wenn ich einen Zauberspruch wirken möchte, muss ich in der Lage sein, die Fertighab dieses Zauberspruchs zu erhalten, um ihn zu instanziieren und seine Informationen zu lesen
- Jeder Schauspieler (egal ob Spieler oder Feind) muss eine Liste möglicher Animationen für die Zauber haben
Die Probleme mit, wie ich versuche, umzusetzen, sind:
- Zum Auflisten der Animationen jedes Schauspielers könnte ich ein verwenden
Dictionary<Spell, Animation>
, aber Wörterbücher werden vom Inspektor nicht unterstützt, was es schwierig macht, mehrere Schauspielertypen einfach zu bearbeiten. - Ich brauche einen Weg, um einfach auf ein Zauberspruch-Fertighaus aus der entsprechenden Enumeration zuzugreifen. Auch hier könnte ich ein Wörterbuch verwenden, aber ich kann nur im Inspektor auf Prefabs verweisen, nicht im Code, was bedeutet, dass ich dieses Wörterbuch nicht füllen kann
Ich suche nach einer Möglichkeit, meine Zaubersprüche einfach mit den entsprechenden Prefabs und Animationen zu verknüpfen
unity
architecture
rpg
data-structure
editors
Malharhak
quelle
quelle
Antworten:
Eine schnelle Möglichkeit, Schlüssel-Wert-Paare in Unitys Inspector abzurufen, besteht darin, eine serialisierbare Eintragsklasse zu definieren und anschließend ein Array oder eine Liste <> davon zu verwenden. z.B...
Dadurch erhalten Sie automatisch eine anpassbare Liste im Inspektor, in der Sie den Schlüssel und den Wert eingeben können, ohne einen benutzerdefinierten Inspektor schreiben zu müssen.
Das Ergebnis sieht so aus:
(Ein Trick: Wenn die serialisierte Eingabeklasse ein Feld "Name" enthält, wird diese Zeichenfolge anstelle der langweiligen Überschriften "Element 0" angezeigt. Nützlich, wenn Sie über komplexere Daten verfügen, in denen Sie effizient navigieren möchten.)
Wenn Sie dies zu einem ScriptableObject machen, können Sie es als ein Asset behandeln, das von Entitätstypen / -instanzen gemeinsam genutzt wird, für die derselbe Animationssatz erforderlich ist. (Andere Klassen werden in Unity in der Regel pro Instanz serialisiert.) Um diesen Weg zu gehen, müssen Sie ein kleines Editor-Skript hinzufügen , mit dem Sie Instanzen davon in Ihrem Assets-Ordner erstellen können .
Bearbeiten: jetzt ist es noch einfacher - Sie können dieses Attribut einfach über Ihrem ScriptableObject hinzufügen :
Dadurch wird das ScriptableObject wie folgt in das Menü "Erstellen" eingefügt:
Sie können das Array optional privat und serialisiert machen, sodass es weiterhin im Inspektor angezeigt wird. Fügen Sie jedoch ein öffentliches Wörterbuch (oder ein privates Wörterbuch mit einer öffentlichen GetAnimation-Methode (Rechtschreibprüfung)) hinzu, das Clients für effizientere Suchvorgänge verwenden können. In der OnEnable () -Methode kann die SpellAnimationMap durch das von Inspektoren gefüllte Array iterieren, um dieses Wörterbuch erneut zu erstellen, und dabei den Vorteil für alle Clientinstanzen gemeinsam nutzen. (Beachten Sie, dass OnEnable () auch im Editor aufgerufen wird, wenn das Asset zum ersten Mal erstellt wird. Überprüfen Sie daher, ob Ihr Array nicht null ist, bevor Sie versuchen, es zu lesen.)
Schließlich können Sie diesem Eintragsdatentyp so viel hinzufügen, wie Sie benötigen. Dies kann zum Beispiel auch das Fertighaus oder eine beliebige Anzahl anderer Datenbits sein, die Sie mit der Rechtschreibprüfung verknüpfen möchten.
Es ist auch möglich, benutzerdefinierte Inspektoren zu schreiben, um Dictionary <,> -Felder direkt auszufüllen, aber der Eindruck, den ich bekomme, ist, dass es schwierig ist, reibungslos zu arbeiten.
quelle
Lesen Sie die Erklärung von @DMGregory
Für diejenigen, die Beispiele mögen:
quelle