J'ai un système de sorts que je crée, le principe est le suivant:
- Chaque sort est un préfabriqué autonome. Il contient un script avec quelques propriétés (dégâts de base, durée ...) qui peuvent être modifiées dans l'inspecteur.
- J'ai une énumération des sorts répertoriant tous les sorts possibles dans le code, qui est utilisé dans la logique du jeu
- Quand je veux lancer un sort, je dois pouvoir obtenir le préfabriqué de ce sort pour l'instancier et lire ses informations
- Chaque acteur (qu'il s'agisse de joueurs ou d'ennemis) doit avoir une liste d'animations possibles pour les sorts
Les problèmes avec la façon dont j'essaie de mettre en œuvre sont:
- Pour répertorier les animations de chaque acteur, je pourrais utiliser un
Dictionary<Spell, Animation>
, mais les dictionnaires ne sont pas pris en charge par l'inspecteur, ce qui rend difficile la modification facile du type de plusieurs acteurs. - J'ai besoin d'un moyen d'accéder facilement à un préfabriqué de sorts à partir de l'énumération correspondante. Ici aussi, je pourrais utiliser un dictionnaire mais je ne peux faire référence qu'aux préfabriqués dans l'inspecteur, pas dans le code, ce qui signifie que je ne serais pas en mesure de remplir ce dictionnaire
Je cherche un moyen d'associer facilement mes énumérations de sorts aux préfabriqués et animations correspondants
unity
architecture
rpg
data-structure
editors
Malharhak
la source
la source
Réponses:
Un moyen rapide d'obtenir des paires clé-valeur dans l'inspecteur Unity consiste à définir une classe d'entrée sérialisable, puis à utiliser un tableau ou une liste <> d'entre elles. par exemple...
Automatiquement, cela vous donnera une liste redimensionnable dans l'inspecteur où vous pourrez entrer la clé et la valeur, sans avoir besoin d'écrire un inspecteur personnalisé.
Le résultat ressemble à ceci:
(Une astuce: si la classe d'entrée sérialisée contient un champ "Nom", cette chaîne sera affichée à la place des en-têtes fades "Élément 0". Utile si vous avez des données plus complexes que vous souhaitez pouvoir naviguer efficacement.)
En faire un ScriptableObject vous permet de le traiter comme un actif partagé entre des types d'entités / instances qui ont besoin du même jeu d'animation, évitant ainsi la surcharge de duplication de la liste pour chacun. (Les autres classes ont tendance à être sérialisées par instance dans Unity). Pour suivre cette voie, vous devrez ajouter un petit script d'éditeur pour vous permettre de créer des instances de ceux-ci dans votre dossier Assets .
Edit: maintenant c'est encore plus facile - vous pouvez simplement ajouter cet attribut au-dessus de votre ScriptableObject:
Cela place le ScriptableObject dans votre menu Créer, comme ceci:
Vous pouvez éventuellement rendre le tableau privé et sérialisé afin qu'il s'affiche toujours dans l'inspecteur, mais ajouter un dictionnaire public (ou un dictionnaire privé avec une méthode publique GetAnimation (sort orthographique)) pour que les clients les utilisent pour des recherches plus efficaces. Dans sa méthode OnEnable (), le SpellAnimationMap peut parcourir son tableau rempli par l'inspecteur pour créer ce dictionnaire une fois, partageant à nouveau l'avantage entre toutes les instances clientes. (Notez que OnEnable () est également appelé dans l'éditeur lors de la création de l'actif, assurez-vous donc de vérifier que votre tableau n'est pas nul avant d'essayer de le lire)
Enfin, vous pouvez en ajouter autant que vous le souhaitez dans ce type de données d'entrée. Il peut également inclure le préfabriqué, par exemple, ou n'importe quel nombre d'autres bits de données que vous souhaitez lier à la clé de sort.
Il est également possible d'écrire des inspecteurs personnalisés pour remplir directement les champs Dictionnaire <,>, mais l'impression que j'ai est qu'il est difficile de travailler correctement.
la source
Lisez l'explication fournie par @DMGregory
À ceux qui aiment les exemples:
la source