2
votes

Créer dynamiquement des balises GameObject dans Unity

Salut à tous,

Je voudrais implémenter une fonctionnalité pour le projet unity actuel sur lequel je travaille qui permet à un utilisateur de fournir un fichier texte formaté, et pour Unity d'instancier des objets en fonction de ce fichier texte (position, rotation, échelle , couleur, etc.). Naturellement, j'aimerais que ces objets soient associés à des balises, ce qui permet de regrouper rapidement et facilement des objets similaires par balise.

Ceci post a été utile pour montrer comment l'éditeur d'unité peut être modifié en appuyant sur «play» pour ajouter et supprimer des balises directement, mais il ignore malheureusement le fait que l'espace de noms UnityEditor ne peut pas être utilisé dans les builds! (se plaignant principalement des types de données serializedObject et serializedProperty vu dans le lien fourni)

En l'état, mon projet fonctionne comme prévu dans l'éditeur proprement dit, mais si je déplace mon créateur de balises actuel et les scripts associés vers un répertoire séparé 'Assets / Editor' et que je construis mon projet, je perds bien sûr toutes les fonctionnalités associées avec ces scripts.

Existe-t-il un autre moyen de procéder soit

  • Incluez en quelque sorte UnityEditor d'une manière contradictoire que je ne connais pas;
  • Créer / modifier des balises de manière dynamique en fonction de la saisie de l'utilisateur via du texte sans utiliser UnityEditor;
  • Mettre en œuvre une fonctionnalité similaire qui imite mais ne nécessite pas de balises

Merci beaucoup!


3 commentaires

Je ne pense pas que vous puissiez faire ça.


D'accord, cela n'est possible que dans un script d'éditeur et il n'y a aucun moyen d'ajouter une balise après la création de l'application.


Le système d'étiquettes aspire à l'unité. Faites simplement ce que je fais, créez le vôtre, une liste simple fonctionne bien.


3 Réponses :


0
votes

Vous ne pouvez pas inclure UnityEditor dans la construction et, pour autant que je sache, il n'y a aucun moyen de créer des balises lors de l'exécution. La solution serait d'implémenter votre propre système d'indexation pour trouver rapidement des objets qui peuvent être instanciés au moment de l'exécution.

Vous pouvez créer une classe DynamicObject: Monobehaviour pour stocker les balises et toutes les autres informations liées au système d'indexation / d'instanciation.

Une implémentation simple consisterait à utiliser un Dictionary > où la clé est une balise. Lors de l'indexation, vous ajouteriez l'objet à autant de listes qu'il a de balises.

Vous ne vous inscririez dans le système que pour les objets qui doivent être instanciés lors de l'exécution, accélérant ainsi la recherche.

Je pense qu'une implémentation aussi simple serait beaucoup plus rapide que les méthodes intégrées d'Unity GameObject.FindGameObjectsWithTag .

En guise de remarque supplémentaire, si vous avez également besoin de définir dynamiquement de nouveaux types en composant des composants réutilisables, je suggère de regarder dans les bibliothèques Entity Component System.


0 commentaires

0
votes

Résolu!

Une expérimentation plus poussée a en effet confirmé que l'espace de noms UnityEditor ne peut tout simplement pas être utilisé dans les builds. Comme proposé par Trey , un utilisateur qui a commenté la question ci-dessus, créer une simple liste de chaînes était idéal.

Chaque objet a maintenant un paramètre psuedoTag, simplement une chaîne directement tirée d'une liste stockée dans un objet tagMaster, et au lieu de vérifier n'importe quel.tag , j'obtiens simplement le composant dans lequel le psuedoTag dans les valeurs de chaîne stockées et comparées. De plus, la nature des listes en C # permet la création et la suppression dynamiques de psuedoTags, et mon projet a exactement la flexibilité que je souhaitais.

Merci encore à tous pour les suggestions!


0 commentaires

0
votes

J'étais confronté à un problème similaire où je devais créer dynamiquement des objets. J'avais besoin d'un moyen de les étiqueter afin de pouvoir les contrôler à l'aide de mes scripts. J'ai donc essayé de les étiqueter dynamiquement mais cela a montré une erreur que la balise ne se ferme pas. J'ai donc essayé de tromper Unity en créant un cube et en lui attribuant la balise que je voulais pour mes objets dynamiques. J'ai gardé le cube au-delà de la mise au point de la caméra et j'ai réussi à le clouer avec succès. Essayez cela peut fonctionner pour vous.


0 commentaires