Unity é unha plataforma que existe desde hai bastante tempo e está en constante evolución. Non obstante, ao traballar nel con varios proxectos ao mesmo tempo, aínda podes atopar dificultades para usar fontes comúns (.cs), bibliotecas (.dll) e outros recursos (imaxes, sons, modelos, prefabricados). Neste artigo falaremos da nosa experiencia cunha solución nativa a un problema deste tipo para Unity.
Métodos de distribución de recursos compartidos
Hai máis dunha forma de utilizar recursos compartidos para proxectos diferentes, pero cada enfoque ten os seus pros e contras.
1. Duplicación: duplicamos recursos entre proxectos "a man".
Pros:
- Apto para todo tipo de recursos.
- Sen problemas de dependencia.
- Non hai problemas cos GUID de activos.
Contras:
- Repositorios xigantes.
- Non hai posibilidade de versionar.
- Dificultade para seguir os cambios nos recursos compartidos.
- Dificultade para actualizar os recursos compartidos.
2.
Pros:
- Podes traballar coas fontes.
- Podes distribuír activos.
- Sen problemas de dependencia.
Contras:
- Requírese experiencia en Git.
- Git non é moi amigable cos ficheiros binarios - terás que conectar LFS.
- Control de acceso a repositorios.
- Dificultade para actualizar e baixar versións.
- As colisións GUID son posibles e non hai un comportamento claro por parte de Unity para resolvelas.
3. NuGet - distribución de bibliotecas compartidas a través de paquetes NuGet.
Pros:
- Traballo cómodo con proxectos que non dependen de Unity.
- Cómodo versión e resolución de dependencias.
Contras:
- Unity non pode funcionar con paquetes NuGet listos para usar (en GitHub podes atopar o xestor de paquetes NuGet para Unity, que soluciona isto, pero hai algúns matices).
- Dificultades para distribuír outro tipo de activos.
4. Xestor de paquetes de Unity: distribución de recursos compartidos a través dunha solución nativa para Unity.
Pros:
- Interface nativa para traballar con paquetes.
- Protección contra a sobreescritura de ficheiros .meta en paquetes debido a conflitos de GUID.
- Posibilidade de versionar.
- Capacidade para distribuír todo tipo de recursos para Unity.
Contras:
- Aínda poden producirse conflitos de GUID.
- Non hai documentación para a súa implementación.
Este último método ten máis vantaxes que inconvenientes. Non obstante, agora non é moi popular debido á falta de documentación e, polo tanto, deterémonos en detalle.
Xestor de paquetes Unity
Unity Package Manager (UPM) é unha ferramenta de xestión de paquetes. Engadiuse en Unity 2018.1 e só se utilizou para paquetes que foron desenvolvidos por Unity Technologies. Non obstante, a partir da versión 2018.3, fíxose posible engadir paquetes personalizados.
Interface do xestor de paquetes de Unity
Os paquetes non acaban nas fontes do proxecto (directorio de activos). Están nun directorio separado %projectFolder%/Library/PackageCache
e non afectan de ningún xeito ao proxecto, a súa única mención no código fonte está no ficheiro packages/manifest.json
.
Paquetes no sistema de ficheiros do proxecto
Fontes de paquetes
UPM pode usar varias fontes de paquetes:
1. Sistema de ficheiros.
Pros:
- Velocidade de implantación.
- Non require ferramentas de terceiros.
Contras:
- Dificultade na versión.
- O acceso compartido ao sistema de ficheiros é necesario para todos os que traballen co proxecto.
2. Repositorio Git.
Pros:
- Todo o que necesitas é un repositorio Git.
Contras:
- Non pode cambiar de versión a través da xanela UPM.
- Non funciona con todos os repositorios Git.
3. repositorio npm.
Pros:
- Admite totalmente a funcionalidade de UPM e úsase para distribuír paquetes oficiais de Unity.
Contras:
- Actualmente ignora todas as versións de cadeas dos paquetes excepto "-preview".
A continuación veremos a implementación de UPM + npm. Este paquete é conveniente porque permite traballar con calquera tipo de recurso e xestionar versións de paquetes, ademais de admitir totalmente a interface nativa de UPM.
Podes usalo como repositorio npm
Configurando o medio ambiente
Primeiro cómpre instalar
Creando un paquete
Para crear un paquete, cómpre colocar o ficheiro package.json
, que o describirá, ao directorio co contido deste paquete. Debes facer o seguinte:
Vaia ao directorio do proxecto no que queremos facer un paquete.
Execute o comando npm init e introduza os valores necesarios durante o diálogo. Para o nome, especifique o nome en formato de dominio inverso, por exemplo com.plarium.somepackage.
Para mostrar comodamente o nome do paquete, engade a propiedade displayName a package.json e enche-o.
Dado que npm está orientado a js, o ficheiro contén as propiedades main e scripts que non necesitamos, que Unity non usa. É mellor eliminalos para non desordenar a descrición do paquete. O ficheiro debería verse algo así:
- Vaia ao directorio do proxecto no que queremos facer un paquete.
- Execute o comando npm init e introduza os valores necesarios durante o diálogo. Para o nome, especifique o nome en formato de dominio inverso, por exemplo com.plarium.somepackage.
- Para mostrar comodamente o nome do paquete, engade a propiedade displayName a package.json e enche-o.
- Dado que npm está orientado a js, o ficheiro contén as propiedades main e scripts que non necesitamos, que Unity non usa. É mellor eliminalos para non desordenar a descrición do paquete. O ficheiro debería verse algo así:
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" }
- Abre Unity e xera un ficheiro .meta para package.json (Unity non ve recursos sen ficheiros .meta, os paquetes para Unity abren só de lectura).
Enviando un paquete
Para enviar o paquete cómpre executar o comando: npm publish --registry *адрес до хранилища пакетов*
.
Instalación e actualización de paquetes mediante Unity Package Manager
Para engadir un paquete a un proxecto de Unity, necesitas:
- Engadir ao ficheiro
manifest.json
información sobre a orixe dos paquetes. Para iso cómpre engadir a propiedadescopedRegistries
e indique os ámbitos e o enderezo de orixe onde se buscarán ámbitos específicos."scopedRegistries": [ { "name": "Main", "url": "адрес до хранилища пакетов", "scopes": [ "com.plarium" ] } ]
- Vaia a Unity e abra a xanela do Xestor de paquetes (traballar con paquetes personalizados non é diferente de traballar con paquetes integrados).
- Seleccione Todos os paquetes.
- Busca o paquete que necesitas e engádeo.
Traballar con fontes e depurar
Para que as fontes estean conectadas ao proxecto, cómpre crear
O uso de paquetes non limita as opcións de depuración. Non obstante, ao traballar con paquetes en Unity, non pode ir ao IDE facendo clic nun erro na consola se o erro ocorreu no paquete. Isto débese a que Unity non ve os scripts como ficheiros separados, xa que cando se usa a Definición de ensamblaxe recóllense nunha biblioteca e inclúense no proxecto. Cando se traballa con fontes dun proxecto, está dispoñible facer clic no IDE.
Script nun proxecto cun paquete conectado:
Script do paquete cun punto de interrupción de traballo:
Correccións urxentes dos paquetes
Os paquetes de Unity engadidos a un proxecto son de só lectura, pero pódense editar na caché de paquetes. Para iso necesitas:
- Vaia ao paquete na caché do paquete.
- Fai os cambios necesarios.
- Actualizar a versión no ficheiro
package.json
. - Enviar paquete
npm publish --registry *адрес до хранилища пакетов*
. - Actualiza a versión do paquete á corrixida a través da interface UPM.
Conflitos de importación de paquetes
Poden producirse os seguintes conflitos de GUID ao importar paquetes:
- Paquete - paquete. Se, ao importar un paquete, se descobre que os paquetes xa engadidos conteñen activos co mesmo GUID, os activos con GUID coincidentes do paquete importado non se engadirán ao proxecto.
- Un paquete é un proxecto. Se, ao importar un paquete, se descobre que o proxecto contén activos con GUID coincidentes, entón os recursos do paquete non se engadirán ao proxecto. Non obstante, os activos que dependen deles comezarán a utilizar os activos do proxecto.
Transferencia de activos dun proxecto a un paquete
Se transfire un recurso dun proxecto a un paquete mentres Unity está aberto, a súa funcionalidade conservarase e as ligazóns dos activos dependentes comezarán a utilizar o recurso do paquete.
É importante: ao copiar un recurso dun proxecto a un paquete, producirase o conflito "Paquete - Proxecto" descrito na sección anterior.
Posibles solucións aos conflitos
- Reasignando GUID mediante os nosos propios algoritmos ao importar todos os recursos para eliminar colisións.
- Engadindo todos os activos a un proxecto e despois dividíndoos en paquetes.
- Crear unha base de datos que conteña os GUID de todos os activos e realizar a validación ao enviar paquetes.
Conclusión
UPM é unha nova solución para distribuír recursos compartidos en Unity, que pode ser unha alternativa digna aos métodos existentes. As recomendacións descritas no artigo baseáronse en casos reais. Esperamos que vos resulten útiles.
Fonte: www.habr.com