Unity es una plataforma que existe desde hace mucho tiempo y está en constante evolución. Sin embargo, cuando se trabaja con varios proyectos al mismo tiempo, aún se pueden encontrar dificultades al utilizar fuentes comunes (.cs), bibliotecas (.dll) y otros activos (imágenes, sonidos, modelos, casas prefabricadas). En este artículo, hablaremos sobre nuestra experiencia con una solución nativa a este problema para Unity.
Métodos de distribución de recursos compartidos
Hay más de una forma de utilizar recursos compartidos para diferentes proyectos, pero cada enfoque tiene sus ventajas y desventajas.
1. Duplicación: "a mano" duplicamos recursos entre proyectos.
Pros:
- Apto para todo tipo de recursos.
- Sin problemas de dependencia.
- No hay problema con los GUID de activos.
Contras:
- Repositorios gigantes.
- No hay posibilidad de versionar.
- Dificultad para rastrear cambios en recursos compartidos.
- Dificultad para actualizar recursos compartidos.
2.
Pros:
- Puedes trabajar con fuentes.
- Puedes distribuir activos.
- Sin problemas de dependencia.
Contras:
- Se requieren habilidades de Git.
- Git no es muy amigable con los archivos binarios; debes incluir LFS.
- Control de acceso a repositorios.
- Dificultad para actualizar y degradar.
- Las colisiones de GUID son posibles y no existe un comportamiento inequívoco por parte de Unity para resolverlas.
3. NuGet: distribución de bibliotecas compartidas a través de paquetes NuGet.
Pros:
- Trabajo conveniente con proyectos que no dependen de Unity.
- Cómodo control de versiones y resolución de dependencias.
Contras:
- Unity no sabe cómo trabajar con paquetes NuGet listos para usar (puede encontrar el Administrador de paquetes NuGet para Unity en GitHub, que soluciona este problema, pero hay matices).
- Dificultades para distribuir otro tipo de activos.
4. Unity Package Manager: distribución de recursos compartidos a través de una solución nativa para Unity.
Pros:
- Interfaz nativa para trabajar con paquetes.
- Protección contra la sobrescritura de archivos .meta en paquetes en caso de conflictos GUID.
- Capacidad de versiones.
- Capacidad de distribuir todo tipo de recursos para Unity.
Contras:
- Aún pueden ocurrir conflictos GUID.
- No existe documentación para la implementación.
Este último método tiene más ventajas que desventajas. Sin embargo, ahora no es muy popular debido a la falta de documentación y, por lo tanto, nos detendremos en ello en detalle.
Administrador de paquetes de Unity
Unity Package Manager (en adelante, UPM) es una herramienta de gestión de paquetes. Se agregó en Unity 2018.1 y solo se usó para paquetes desarrollados por Unity Technologies. Sin embargo, a partir de la versión 2018.3, fue posible agregar paquetes personalizados.
Interfaz del administrador de paquetes de Unity
Los paquetes no terminan en las fuentes del proyecto (directorio de Activos). Están en un directorio separado. %projectFolder%/Library/PackageCache
y no afectan el proyecto de ninguna manera, su única mención en el código fuente está en el archivo packages/manifest.json
.
Paquetes en el sistema de archivos del proyecto.
Fuentes de paquetes
UPM puede utilizar varias fuentes de paquetes:
1. Sistema de archivos.
Pros:
- Velocidad de implementación.
- No requiere herramientas de terceros.
Contras:
- Complejidad de versiones.
- Se requiere acceso compartido al sistema de archivos para todos los que trabajan con el proyecto.
2. Repositorio Git.
Pros:
- Todo lo que necesitas es un repositorio Git.
Contras:
- No puede cambiar entre versiones a través de la ventana de UPM.
- No funciona con todos los repositorios de Git.
3. repositorio npm.
Pros:
- Es totalmente compatible con la funcionalidad UPM y se utiliza para distribuir paquetes oficiales de Unity.
Contras:
- Actualmente ignora todas las versiones de cadenas de paquetes excepto "-preview".
Veremos la implementación de UPM + npm a continuación. Este paquete es conveniente porque le permite trabajar con cualquier tipo de recursos y administrar versiones de paquetes, y también es totalmente compatible con la interfaz nativa de UPM.
Como repositorio npm, puedes usar
Configuración del entorno
Primero necesitas instalar
Crear un paquete
Para crear un paquete, debe colocar el archivo package.json
, que lo describirá, al directorio con el contenido de este paquete. Necesitas hacer lo siguiente:
Vaya al directorio del proyecto en el que queremos crear un paquete.
Ejecute el comando npm init e ingrese los valores requeridos durante el diálogo. Para el nombre, especifique el nombre en formato de dominio inverso, por ejemplo, com.plarium.somepackage.
Para mostrar cómodamente el nombre del paquete, agregue la propiedad displayName a package.json y rellénelo.
Dado que npm está orientado a js, el archivo contiene las propiedades main y scripts que no necesitamos y que Unity no usa. Es mejor eliminarlos para no obstruir la descripción del paquete. El archivo debería verse así:
- Vaya al directorio del proyecto en el que queremos crear un paquete.
- Ejecute el comando npm init e ingrese los valores requeridos durante el diálogo. Para el nombre, especifique el nombre en formato de dominio inverso, por ejemplo, com.plarium.somepackage.
- Para mostrar cómodamente el nombre del paquete, agregue la propiedad displayName a package.json y rellénelo.
- Dado que npm está orientado a js, el archivo contiene las propiedades main y scripts que no necesitamos y que Unity no usa. Es mejor eliminarlos para no obstruir la descripción del paquete. El archivo debería verse así:
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" }
- Abra Unity y genere un archivo .meta para package.json (Unity no ve los recursos sin archivos .meta, los paquetes de Unity se abren en modo de solo lectura).
enviando un paquete
Para enviar un paquete, debe ejecutar el comando: npm publish --registry *адрес до хранилища пакетов*
.
Instalación y actualización de paquetes a través del Administrador de paquetes de Unity
Para agregar un paquete a un proyecto de Unity, necesita:
- escribir al archivo
manifest.json
información sobre el origen de los paquetes. Para hacer esto, necesita agregar una propiedad.scopedRegistries
e indicar los alcances y la dirección de la fuente por la cual se buscarán alcances específicos."scopedRegistries": [ { "name": "Main", "url": "адрес до хранилища пакетов", "scopes": [ "com.plarium" ] } ]
- Vaya a Unity y abra la ventana del Administrador de paquetes (trabajar con paquetes personalizados no es diferente de trabajar con los integrados).
- Seleccione Todos los paquetes.
- Busque el paquete requerido y agréguelo.
Trabajar con fuentes y depurar
Para que las fuentes estén conectadas al proyecto, debe crear
El uso de paquetes no limita el alcance de la depuración. Sin embargo, cuando trabaja con paquetes en Unity, no puede ir al IDE haciendo clic en un error en la consola si el error ocurrió en el paquete. Esto se debe a que Unity no ve los scripts como archivos separados, porque cuando se usa la definición de ensamblaje, se recopilan en una biblioteca y se incluyen en el proyecto. Cuando se trabaja con fuentes de un proyecto, está disponible una transición de clic al IDE.
Script en un proyecto con un paquete conectado:
Script del paquete con un punto de interrupción funcional:
Correcciones urgentes a los paquetes.
Los paquetes de Unity agregados al proyecto son de solo lectura, pero se pueden editar en la caché del paquete. Para esto necesitas:
- Vaya al paquete en la caché de paquetes.
- Haz los cambios necesarios.
- Actualizar versión en archivo
package.json
. - enviar paquete
npm publish --registry *адрес до хранилища пакетов*
. - Actualice la versión del paquete a la corregida a través de la interfaz de UPM.
Conflictos de importación de paquetes
Al importar paquetes, pueden ocurrir los siguientes conflictos de GUID:
- El paquete es un paquete. Si, al importar un paquete, se descubre que los paquetes ya agregados tienen recursos con el mismo GUID, los activos con GUID coincidentes del paquete importado no se agregarán al proyecto.
- El paquete es un proyecto. Si, al importar un paquete, se descubre que el proyecto tiene activos con GUID coincidentes, los activos del paquete no se agregarán al proyecto. Sin embargo, los activos que dependen de ellos comenzarán a utilizar los activos del proyecto.
Transferir activos de un proyecto a un paquete
Si transfiere un activo de un proyecto a un paquete mientras Unity está abierto, se conservará su funcionalidad y los enlaces en activos dependientes comenzarán a utilizar el activo del paquete.
Es importante: Al copiar un recurso de un proyecto a un paquete, se producirá el conflicto paquete-proyecto descrito en la sección anterior.
Posibles soluciones a los conflictos.
- Reasignación de GUID según algoritmos propios al importar todos los activos para evitar colisiones.
- Agregar todos los activos a un proyecto con su posterior separación en paquetes.
- Cree una base de datos que contenga los GUID de todos los activos y valídela al enviar paquetes.
Conclusión
UPM es una nueva solución para distribuir recursos compartidos en Unity que puede ser una alternativa valiosa a los métodos existentes. Las recomendaciones descritas en el artículo surgieron a partir de casos reales. Esperamos que los encuentres útiles.
Fuente: habr.com