Unity â une plateforme qui existe depuis longtemps et qui est en constante Ă©volution. Cependant, en travaillant sur plusieurs projets en mĂȘme temps, il est encore possible de rencontrer des difficultĂ©s avec l'utilisation de sources communes (.cs), de bibliothĂšques (.dll) et d'autres ressources (images, sons, modĂšles, prefabs). Dans cet article, nous partagerons notre expĂ©rience de travail avec une solution native Ă ce problĂšme pour Unity.

Méthodes de partage des ressources communes
Il existe plusieurs façons d'utiliser des ressources communes pour différents projets, mais chaque approche a ses avantages et ses inconvénients.
1. Duplication â duplication manuelle des ressources entre les projets.
Avantages :
- Convient Ă tous les types de ressources.
- Aucun problÚme de dépendances.
- Aucun problĂšme de GUID des ressources.
Inconvénients :
- Répertoires gigantesques.
- Aucune possibilité de versioning.
- Difficulté de suivi des modifications des ressources communes.
- Difficulté de mise à jour des ressources communes.
2. â partage de ressources communes via des sous-modules externes.
Avantages :
- Il est possible de travailler avec des sources.
- Il est possible de partager des ressources.
- Aucun problÚme de dépendances.
Inconvénients :
- Nécessite des compétences en Git.
- Git ne gĂšre pas trĂšs bien les fichiers binaires â il faudra utiliser LFS.
- ContrÎle d'accÚs pour les répertoires.
- Difficultés lors de l'augmentation et de la diminution des versions.
- Des collisions de GUID sont possibles et il n'y a pas de comportement univoque de la part d'Unity pour les résoudre.
3. NuGet â partage des bibliothĂšques communes via des paquets NuGet.
Avantages :
- Travail pratique avec des projets indépendants d'Unity.
- Versioning et résolution des dépendances faciles.
Inconvénients :
- Unity ne sait pas travailler avec des paquets NuGet « par défaut » (il est possible de trouver sur GitHub un gestionnaire de paquets NuGet pour Unity qui corrige cela, mais il y a des nuances).
- Difficultés lors du partage d'autres types de ressources.
4. Gestionnaire de paquets Unity â partage de ressources communes via une solution native pour Unity.
Avantages :
- Interface native pour travailler avec des paquets.
- Protection contre l'écrasement des fichiers .meta dans les paquets lors des conflits de GUID.
- Possibilité de versioning.
- Possibilité de partager tous les types de ressources pour Unity.
Inconvénients :
- Des conflits de GUID peuvent toujours survenir.
- Aucune documentation pour la mise en Ćuvre.
La derniÚre méthode présente plus d'avantages que d'inconvénients. Cependant, elle n'est pas trÚs populaire en raison de l'absence de documentation, et c'est pourquoi nous allons nous y attarder en détail.
Gestionnaire de packages Unity
Unity Package Manager (ci-aprÚs UPM) est un outil de gestion des paquets. Il a été ajouté à Unity 2018.1 et n'était utilisé que pour les paquets développés par Unity Technologies. Cependant, à partir de la version 2018.3, il est possible d'ajouter des paquets personnalisés.

Interface de Unity Package Manager
Les paquets ne se trouvent pas dans les sources du projet (répertoire Assets). Ils se trouvent dans un répertoire séparé. %projectFolder%/Library/PackageCache et n'influencent en rien le projet, leur seule mention dans les sources se trouve dans le fichier packages/manifest.json.

Paquets dans le systĂšme de fichiers du projet
Sources des paquets
UPM peut utiliser plusieurs sources de paquets :
1. SystĂšme de fichiers.
Avantages :
- Vitesse de mise en Ćuvre.
- Ne nécessite pas d'outils tiers.
Inconvénients :
- Complexité de la gestion des versions.
- Un accÚs commun au systÚme de fichiers est nécessaire pour tous ceux qui travaillent sur le projet.
2. DépÎt Git.
Avantages :
- Seul un dépÎt Git est nécessaire.
Inconvénients :
- Il n'est pas possible de changer de version via l'interface UPM.
- Ne fonctionne pas avec tous les dépÎts Git.
3. DépÎt npm.
Avantages :
- Prend entiÚrement en charge la fonctionnalité UPM et est utilisé pour distribuer les paquets Unity officiels.
Inconvénients :
- Actuellement, toutes les versions de chaßne de paquets, sauf "-preview", sont ignorées.
Nous examinerons ci-dessous la mise en Ćuvre de UPM + npm. Cette combinaison est pratique car elle permet de travailler avec tous les types de ressources et de gĂ©rer les versions des paquets tout en prenant en charge l'interface native UPM.
Comme dépÎt npm, on peut utiliser . Une documentation détaillée est disponible, et son lancement nécessite littéralement quelques commandes. Configuration de l'environnement
Pour commencer, vous devez installer
Création d'un paquet .
Pour créer un paquet, il est nécessaire de placer le fichier
, qui le décrira, dans le répertoire contenant le contenu de ce paquet. Voici ce qu'il faut faire : package.jsonAccédez au répertoire du projet que vous souhaitez transformer en paquet.
Exécutez la commande npm init et pendant le dialogue, saisissez les valeurs nécessaires. Pour name, indiquez un nom au format inverse de domaine, par exemple com.plarium.somepackage.
Pour une meilleure affichage du nom du paquet, ajoutez la propriété displayName dans le package.json et remplissez-la.
Ătant donnĂ© que npm est orientĂ© vers js, le fichier contient des propriĂ©tĂ©s main et scripts qui ne nous sont pas utiles et que Unity n'utilise pas. Il vaut mieux les supprimer pour ne pas encombrer la description du paquet. Le fichier doit ressembler Ă ceci :
Ătant donnĂ© que npm est orientĂ© vers le JS, le fichier contient des propriĂ©tĂ©s main et scripts qui ne sont pas nĂ©cessaires pour Unity. Il est prĂ©fĂ©rable de les supprimer afin de ne pas surcharger la description du paquet. Le fichier devrait ressembler Ă ceci :
- Exécutez la commande npm init et pendant le dialogue, saisissez les valeurs nécessaires. Pour name, indiquez un nom au format inverse de domaine, par exemple com.plarium.somepackage.
- Pour une meilleure affichage du nom du paquet, ajoutez la propriété displayName dans le package.json et remplissez-la.
- Ătant donnĂ© que npm est orientĂ© vers js, le fichier contient des propriĂ©tĂ©s main et scripts qui ne nous sont pas utiles et que Unity n'utilise pas. Il vaut mieux les supprimer pour ne pas encombrer la description du paquet. Le fichier doit ressembler Ă ceci :
- Ătant donnĂ© que npm est orientĂ© vers le JS, le fichier contient des propriĂ©tĂ©s main et scripts qui ne sont pas nĂ©cessaires pour Unity. Il est prĂ©fĂ©rable de les supprimer afin de ne pas surcharger la description du paquet. Le fichier devrait ressembler Ă ceci :
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" } - Ouvrez Unity et générez un fichier .meta pour package.json (Unity ne voit pas les assets sans fichiers .meta, les packages pour Unity s'ouvrent en mode lecture seule).
Envoi de package
Pour envoyer le package, vous devez exécuter la commande : npm publish --registry *adresse du dépÎt de packages*.
Installation et mise Ă jour des packages via le gestionnaire de packages Unity
Pour ajouter un package Ă un projet Unity, il faut :
- Modifier le fichier
manifest.jsonavec les informations sur la source des packages. Pour cela, il faut ajouter la propriĂ©tĂ©scopedRegistrieset indiquer les scopes et l'adresse de la source oĂč seront recherchĂ©s les scopes spĂ©cifiques."scopedRegistries": [ { "name": "Main", "url": "adresse du dĂ©pĂŽt de packages", "scopes": [ "com.plarium" ] } ] - AccĂ©dez Ă Unity et ouvrez la fenĂȘtre du gestionnaire de packages (le travail avec des packages personnalisĂ©s ne diffĂšre pas de celui avec les intĂ©grĂ©s).
- Sélectionnez Tous les Packages.
- Trouvez le package requis et ajoutez-le.

Travail avec les sources et débogage
Pour que les sources se connectent au projet, vous devez créer un pour le package.
L'utilisation des packages ne limite pas les possibilités de débogage. Cependant, lors de l'utilisation de packages dans Unity, il n'est pas possible de passer à l'IDE en cliquant sur une erreur dans la console, si l'erreur s'est produite dans le package. Cela est dû au fait qu'Unity ne voit pas les scripts comme des fichiers distincts, car lors de l'utilisation de l'Assembly Definition, ils sont compilés dans une bibliothÚque et intégrés au projet. Lors de l'utilisation des sources du projet, le passage à l'IDE par un clic est disponible.
Script dans un projet avec un package connecté :

Script du package avec un point d'arrĂȘt actif :

Modifications urgentes dans les packages
Les packages Unity ajoutĂ©s au projet sont en lecture seule, mais ils peuvent ĂȘtre modifiĂ©s dans le cache des packages. Pour cela, vous devez :
- Accéder au package dans le cache des packages.

- Apporter les modifications nécessaires.
- Mettre Ă jour la version dans le fichier
package.json. - Envoyer le package
npm publish --registry *adresse du dépÎt de packages*. - Mettre à jour la version du package corrigée via l'interface UPM.
Conflits d'importation de packages
Lors de l'importation de packages, les conflits de GUID suivants peuvent survenir :
- Package â package. Si, lors de l'importation d'un package, il s'avĂšre que dans les packages dĂ©jĂ ajoutĂ©s, il existe des assets avec le mĂȘme GUID, les assets avec des GUID correspondants du package importĂ© ne seront pas ajoutĂ©s au projet.
- Un paquet est un projet. Si, lors de l'importation d'un paquet, des actifs avec des GUIDs correspondants sont détectés dans le projet, ces actifs ne seront pas ajoutés au projet. Cependant, les actifs qui en dépendent commenceront à utiliser les actifs du projet.
Transfert des actifs du projet vers le paquet
Si un actif est transféré du projet vers le paquet pendant que Unity est ouvert, sa fonctionnalité sera conservée et les références dans les actifs dépendants commenceront à utiliser l'actif du paquet.
Important: lors de la copie d'un actif du projet vers le paquet, un conflit « Paquet â projet » se produira, comme dĂ©crit dans la section prĂ©cĂ©dente.
Solutions possibles aux conflits
- Réaffectation des GUIDs selon des algorithmes propres lors de l'importation de tous les actifs, afin d'éviter les collisions.
- Ajout de tous les actifs dans un seul projet puis leur division en paquets.
- Création d'une base de données contenant les GUIDs de tous les actifs et validation lors de l'envoi des paquets.
Conclusion
UPM est une nouvelle solution pour la distribution de ressources partagées sur Unity, qui peut devenir une alternative valable aux méthodes existantes. Les recommandations décrites dans l'article sont basées sur des cas réels. Nous espérons qu'elles vous seront utiles.
Source : habr.com

