Je travaille avec une équipe qui se fait appeler Defective Studios. Nous avons lutté avec le même problème pendant des années, et tout récemment, j'ai finalement cédé et commencé à écrire une extension pour m'aider à fusionner les objets de jeu.
Fondamentalement, l'approche consiste à créer une interface de type inspecteur dans une fenêtre qui aligne chaque objet de jeu, composant et propriété côte à côte pour comparaison, et fournit des boutons pour copier des valeurs (ou des objets entiers) d'un côté à l'autre. Si vous connaissez la SerializedProperty
classe, c'est ce qui fait la majeure partie du travail ici. Nous créons essentiellement une interface graphique qui synchronise l'état de dépliage entre le côté droit et le côté gauche, et crée un espace vertical partout où un GameObject
ouComponent
n'existe que du côté droit ou gauche. Une fonction de comparaison vérifie l'égalité à chaque niveau et transforme l'arrière-plan de chaque ligne en rouge ou vert en fonction de l'état de l'égalité. Toute ligne dont les enfants contiennent une différence deviendra également rouge, et nous avons également inclus un bouton astucieux pour rechercher récursivement l'arborescence et développer tous les objets qui sont différents ou qui ont des différences dans leurs enfants.
De plus, il existe un ensemble de champs de masque qui vous permettent de filtrer certains types de composants hors de la comparaison. Les attributs GameObject comme le nom, la couche et la balise sont également comparés. Nous utilisons SerializedObject
et SerializedProperty
pour parcourir les gameObject
propriétés de, et les dessiner exactement comme ils sont dessinés dans l'inspecteur. Cela garantit la cohérence et est beaucoup plus facile à coder!
Un dernier détail intéressant est que le processus de comparaison (déclenché lorsque les objets sont chargés et chaque fois qu'un changement est effectué) est exécuté dans une coroutine ad hoc qui est mise à jour par la EditorWindow.Update
fonction, de sorte que si vous comparez un objet extrêmement compliqué, la fenêtre ne verrouille pas l'éditeur. C'était un must lors de la comparaison d'objets avec des centaines (ou des milliers!) D'enfants. Dans l'ensemble, c'était une sorte de "projet lego" comme mon ami aime à le dire, mais certainement un outil inestimable qui est instantanément devenu une partie de notre flux de travail de collaboration.
L'outil, Unity Merge est documenté sur le wiki Unify, qui comprend une feuille de route et une adresse e-mail pour les commentaires et les rapports de problèmes. Si vous êtes vraiment aux prises avec une fusion compliquée, essayez-la et dites-nous ce que vous en pensez! De plus, je n'ai pas pris la peine de le construire dans une DLL, alors n'hésitez pas à fouiller à la source. L'implémentation et les SerializedProperty
manipulations ad hoc de coroutine , ainsi que quelques astuces d'interface graphique dont j'ai fini par avoir besoin sont une grande partie de votre boîte à outils d'extension d'éditeur. Je suis très intéressé par les changements / améliorations que les utilisateurs pourraient avoir, alors contactez-moi!