Un éditeur Unity amélioré : des enums dynamiques !
Le package String Data List relie des listes de chaînes en fichiers texte à des champs Unity, pour coder en entiers et éditer en noms lisibles.
Parmi tous les packages que j’ai créés pour Unity, j’aime beaucoup celui-ci, et pourtant, c’est presque le dernier que j’ai créé pour m’aider, moi et les autres. Quand vous faites du design dans Unity, une question revient souvent : comment relier les données de design issues de documents, parfois réalisés avec des tableurs en ligne, aux objets et aux scènes dans Unity.
Ensuite, il faut les utiliser dans vos prefabs, vos outils d’éditeur, et cætera. Mais comment avoir à la fois un code optimisé et des données intelligibles dans l’éditeur ? Dans d’autres langages, il existe des enums dynamiques et d’autres choses du genre, mais pas ici. Il existe aussi des outils qui génèrent du code à partir d’une liste de chaînes, comme les outils de localisation, mais ils restent difficiles à utiliser.
Cet outil, publié sous le nom String Data List, aide à répondre à ce problème : vous pouvez coder avec de simples entiers et faire votre design à partir d’une liste de chaînes dans l’éditeur, comme dans l’exemple ci-dessous.

Comment ça marche ?
D’abord, il y a la liste : un simple fichier texte contenant une chaîne par ligne.
Ensuite, vous devez relier la liste à un champ ou à une propriété de votre MonoBehaviour. J’ai choisi de créer l’attribut Select pour cela (comme la balise SELECT du bon vieux HTML pour les listes déroulantes). Il prend un paramètre de type chaîne qui correspond au nom du fichier texte. Il sert d’identifiant à la liste de données.

Le SelectDrawer prend ensuite le relais. Il utilise le paramètre pour charger le fichier texte et remplace un champ entier ou un champ chaîne standard par une liste d’enum, c’est aussi simple que ça !
Enfin, ça pourrait l’être. Mais il prend aussi en compte d’autres cas : la propriété entière peut être une propriété de type chaîne, le drawer s’adapte de lui-même.
Il affiche également un bouton X rouge pour réinitialiser la valeur du champ : -1 pour un entier, et null pour une chaîne.

Autre chose : il gère les erreurs. Si le fichier texte n’existe pas ou ne contient rien, la propriété affiche le champ éditable par défaut correspondant au type détecté.
Et enfin, cerise sur le gâteau : vous pouvez ajouter un second paramètre pour afficher un avertissement si une erreur est détectée.

L’attribut DataList
Et même là, ce n’était pas suffisant. En fait, mon tout premier besoin était d’afficher une liste de noms au lieu d’une liste de « element + index » devant une liste, y compris pour des éléments qui n’ont pas de propriété nom de type chaîne en première position.
Mais je me suis heurté à un problème : comment avoir un drawer pour la liste entière plutôt que pour chaque élément ? Si vous avez déjà essayé, vous savez qu’un attribut placé devant une List est appelé pour chaque élément et non pour la liste elle-même, j’ai donc dû trouver une astuce.
Mon astuce consiste à utiliser une classe générique DataList<T> qui encapsule la liste elle-même. Par commodité, j’ai défini un opérateur d’indexation qui appelle l’indexeur de la liste interne, ainsi qu’une propriété Count.
De cette façon, vous pouvez avoir une DataList<Animal> et l’utiliser comme vous utiliseriez la List<Animal> standard, avec l’indexeur et Count. En pratique, vous devrez créer une AnimalList qui hérite de DataList<Animal>, car Unity n’est pas capable de sérialiser les types génériques (pas encore ?), mais c’est une ligne de code pour l’ensemble du projet.
Dans l’éditeur Unity, cela ressemblera à l’image ci-dessous. Dans cet exemple, nous utilisons le même fichier texte que celui présenté au début de cet article.

Envie d’une autre fonctionnalité sympa ? J’en ai deux !
- Plusieurs fichiers : vous pouvez avoir plusieurs fichiers portant le même nom dans différents dossiers Resources/datalist. Tous les noms seront ajoutés dans la liste d’enum. Pratique pour les propriétés de type chaîne (par exemple, si vous voulez séparer différents types d’animaux tout en pouvant parfois choisir parmi tous), cela peut être risqué avec des propriétés entières, car l’ordre de chargement n’est pas garanti !
- Plusieurs ids pour Select : vous pouvez choisir de charger plusieurs fichiers pour un même champ avec un attribut Select. Cela vous permet d’avoir des noms distincts, par exemple des noms de légumes et de fruits, puis une propriété où vous voulez les deux : il suffit de lui dire d’utiliser les deux ! Comme pour la fonctionnalité précédente, c’est dangereux d’y aller se.. euh, non.. d’utiliser un entier ici.
Disponible gratuitement sur openUPM
Maintenant, vous voudrez peut-être utiliser ce package String Data List dans vos projets, moi c’est certain. Pour l’utiliser largement dans les miens, je l’ai importé dans le dépôt de packages openupm. Pour importer n’importe lequel de mes outils disponibles sur OpenUPM, suivez les étapes ci-dessous.
1. Ajouter openUPM comme scoped registry dans Unity
Depuis le projet dans lequel vous voulez ajouter votre package, allez dans vos project settings, dans la section nommée package manager, où vous pouvez ajouter un scoped registry.
Pour un même registry, openUPM, vous pouvez ajouter plusieurs scopes si vous y trouvez d’autres assets utiles : veillez donc à ajouter tous les scopes que vous souhaitez pour que Unity aille les chercher au bon endroit. Donnez-lui le nom que vous voulez, j’utilise simplement OpenUPM. Renseignez l’URL https://package.openupm.com puis commencez par ajouter « com.fredericrp », et cliquez sur Apply.

Ajouter un scoped registry dans les project settings
2. Importer le package depuis le Package Manager
Une fois cela fait, vous verrez les registries correspondants dans le Package Manager de Unity, dans la section « My Registries » : mes packages sont regroupés sous le nom « FredericRP ». Comme pour n’importe quel autre package, vous pouvez installer, mettre à jour et supprimer les packages directement ici, et ils apparaîtront dans le dossier « Packages » de votre projet.

Retrouvez le package String Data List et les autres juste ici !
C’est l’un des nombreux outils que je partage sur openUPM : suivez-moi pour comprendre et découvrir tous les autres outils que je partage, et suivre mon parcours avec Unity !
Si cet article vous a plu, n’hésitez pas à applaudir ou à laisser un commentaire, et merci de l’avoir lu jusqu’au bout !