Unidade é uma plataforma que existe há muito tempo e está em constante evolução. No entanto, trabalhando nele com vários projetos ao mesmo tempo, ainda é possível encontrar dificuldades no uso de fontes comuns (.cs), bibliotecas (.dll) e outros ativos (imagens, sons, modelos, prefabs). Neste artigo, falaremos sobre nossa experiência em trabalhar com uma solução nativa para esse problema do Unity.
Métodos de distribuição de recursos compartilhados
Há mais de uma maneira de usar recursos compartilhados para diferentes projetos, mas cada abordagem tem seus prós e contras.
1. Duplicação - “mãos” duplicam recursos entre projetos.Prós:
- Adequado para todos os tipos de recursos.
- Sem problemas de dependência.
- Não há problema com os GUIDs de ativos.
Contras:
- Repositórios gigantescos.
- Não é possível versionar.
- A dificuldade de rastrear alterações nos recursos compartilhados.
- Dificuldade em atualizar recursos compartilhados.
2. Sub-módulos Git - distribuição de recursos compartilhados através de sub-módulos externos.Prós:
- Você pode trabalhar com códigos-fonte.
- Os ativos podem ser distribuídos.
- Sem problemas de dependência.
Contras:
- Git habilidades necessárias.
- O Git não é muito amigável com arquivos binários - você precisa conectar o LFS.
- Controle de acesso para repositórios.
- Dificuldades na atualização e desatualização.
- Colisões de GUIDs são possíveis e não há comportamento inequívoco por parte do Unity para resolvê-los.
3. NuGet - distribuição de bibliotecas compartilhadas através dos pacotes NuGet.Prós:
- Trabalho conveniente com projetos que não dependem do Unity.
- Versão conveniente e resolução de dependências.
Contras:
- O Unity não sabe como trabalhar com pacotes NuGet imediatamente (no GitHub, você pode encontrar o NuGet Package Manager for Unity, que corrige isso, mas existem algumas nuances).
- Dificuldades na distribuição de outros tipos de ativos.
4. Unity Package Manager - distribuição de recursos compartilhados por meio de uma solução nativa para o Unity.Prós:
- Interface nativa para trabalhar com pacotes.
- Proteção contra a substituição de arquivos .meta em pacotes em caso de conflitos de GUID.
- Possibilidade de versionamento.
- A capacidade de distribuir todos os tipos de recursos para o Unity.
Contras:
- Conflitos de GUID ainda podem ocorrer.
- Não há documentação para implementar.
O último método tem mais vantagens do que desvantagens. No entanto, não é muito popular no momento devido à falta de documentação e, portanto, vamos nos aprofundar nisso em detalhes.
Gerenciador de Pacotes Unity
O Unity Package Manager (doravante UPM) é uma ferramenta de gerenciamento de pacotes. Foi adicionado no Unity 2018.1 e foi usado apenas para pacotes desenvolvidos pela Unity Technologies. No entanto, a partir da versão 2018.3, tornou-se possível adicionar pacotes personalizados.
Interface do Gerenciador de Pacotes UnityOs pacotes não se enquadram nas fontes do projeto (diretório de ativos). Eles estão localizados em um diretório separado
%projectFolder%/Library/PackageCache
e não afetam o projeto de forma alguma; sua única menção nas fontes está no arquivo
packages/manifest.json
.
Pacotes no sistema de arquivos do projetoFontes do pacote
O UPM pode usar várias fontes de pacotes:
1. O sistema de arquivos.Prós:
- Velocidade de implementação.
- Não são necessárias ferramentas de terceiros.
Contras:
- A complexidade do controle de versão.
- O compartilhamento de arquivos é necessário para todos que trabalham com o projeto.
2. Repositório Git.Prós:
- Apenas um repositório Git é necessário.
Contras:
- Você não pode alternar entre versões através da janela UPM.
- Não funciona com todos os repositórios Git.
3. repositório npm.Prós:
- Suporta totalmente a funcionalidade UPM e é usado para distribuir pacotes oficiais do Unity.
Contras:
- Atualmente, ele ignora todas as versões de cadeia de pacotes, exceto "-preview".
Abaixo, examinamos a implementação do UPM + npm. Esse pacote é conveniente porque permite trabalhar com qualquer tipo de recursos e gerenciar versões de pacotes e também oferece suporte total à interface UPM nativa.
Você pode usar o
Verdaccio como um repositório npm. Há
documentação detalhada para isso e serão necessários apenas alguns comandos para iniciá-lo.
Configuração do ambiente
Primeiro você precisa instalar o
node.js.Criação de pacote
Para criar um pacote, você deve colocar o arquivo
package.json
, que o descreverá, no diretório com o conteúdo deste pacote. Você precisa fazer o seguinte:
- Vá para o diretório do projeto que queremos criar um pacote.
- Execute o comando
npm init
e insira os valores necessários durante o diálogo. Para nome, especifique o nome no formato do domínio reverso, por exemplo com.plarium.somepackage
. - Para exibir convenientemente o nome do pacote, adicione a propriedade
displayName
ao package.json
e preencha-a. - Como o npm é orientado a js, o arquivo contém propriedades que não precisamos de
scripts
main
e que o Unity não usa. É melhor removê-los para não bagunçar a descrição do pacote. O arquivo deve ser algo como isto:
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" }
- Abra o Unity e gere um arquivo .meta para package.json (o Unity não vê ativos sem os arquivos .meta, os pacotes do Unity são abertos apenas para leitura).
Envio de pacotes
Para enviar um pacote, você precisa executar o comando:
npm publish --registry * *
.
Instalando e atualizando pacotes através do Unity Package Manager
Para adicionar um pacote a um projeto do Unity, você precisa:
- Adicione informações de origem do pacote ao arquivo
manifest.json
. Para fazer isso, adicione a propriedade scopedRegistries
e especifique os escopos e o endereço de origem onde os escopos específicos serão pesquisados.
"scopedRegistries": [ { "name": "Main", "url": " ", "scopes": [ "com.plarium" ] } ]
- Vá para o Unity e abra a janela do Gerenciador de Pacotes (trabalhar com pacotes personalizados não é diferente de trabalhar com pacotes internos).
- Selecione Todos os Pacotes.
- Encontre o pacote que você precisa e adicione-o.
Trabalhar com fontes e depuração
Para que as fontes se conectem ao projeto, você deve criar uma
Definição de Montagem para o pacote.
O uso de pacotes não limita os recursos de depuração. No entanto, ao trabalhar com pacotes no Unity, você não pode acessar o IDE clicando em um erro no console se o erro ocorreu no pacote. Isso se deve ao fato de o Unity não ver os scripts como arquivos separados, porque ao usar a Definição de Montagem, eles são coletados em uma biblioteca e conectados ao projeto. Ao trabalhar com códigos-fonte de um projeto, a mudança para o IDE por clique está disponível.
O script no projeto com o pacote conectado:
Script do pacote com um ponto de interrupção de trabalho:
Correções urgentes de patches
Os pacotes Unity adicionados ao projeto são somente leitura, mas podem ser editados no cache do pacote. Para fazer isso, você deve:
- Vá para o pacote no cache do pacote.
- Faça as alterações necessárias.
- Atualize a versão no arquivo
package.json
. - Envie o
npm publish --registry * *
pacote npm publish --registry * *
. - Atualize a versão do pacote para a corrigida através da interface UPM.
Conflitos de importação de pacotes
Ao importar pacotes, os seguintes conflitos GUID podem ocorrer:
- Pacote - pacote. Se, ao importar um pacote, for encontrado que os pacotes já adicionados possuem ativos com o mesmo GUID, os ativos com GUIDs correspondentes do pacote importado não serão adicionados ao projeto.
- Um pacote é um projeto. Se, ao importar um pacote, parecer que o projeto possui ativos com GUIDs correspondentes, os ativos do pacote não serão adicionados ao projeto. No entanto, os ativos que dependem deles começarão a usar ativos do projeto.
Transferindo ativos de um projeto para um pacote
Se você transferir ativos de um projeto para um pacote com o Unity aberto, sua funcionalidade será preservada e os links nos ativos dependentes começarão a usar ativos do pacote.
Importante : quando você copia um ativo de um projeto para um pacote, o conflito "Pacote - Projeto" ocorrerá, conforme descrito na seção acima.
Possíveis soluções de conflito
- Reatribuição de GUIDs de acordo com seus próprios algoritmos ao importar todos os ativos para evitar colisões.
- Adicionando todos os ativos a um projeto com sua divisão subsequente em pacotes.
- Criação de um banco de dados contendo GUIDs de todos os ativos e validação ao enviar pacotes.
Conclusão
O UPM é uma nova solução para a distribuição de recursos compartilhados ao Unity, que pode ser uma alternativa válida aos métodos existentes. As recomendações descritas no artigo surgiram com base em casos reais. Esperamos que você os ache úteis.