Comece a desenvolver jogos no Unity

Este guia descreve um ciclo típico de desenvolvimento de jogos. Depois de ler este guia, talvez seja útil usá-lo também como referência.

Ao trabalhar com o Unity, o ciclo de vida de desenvolvimento consiste em três fases:

  • Planejamento e design
  • Desenvolver e testar
  • Publicar e manter

Planejamento e design

Na fase de planejamento e design, você determina como criar o jogo. Você decide como lidar com os desafios de desenvolver para dispositivos móveis e identifica as ferramentas e os processos a serem usados no desenvolvimento.

Receber contribuições de todos os membros da equipe

Trabalhe com as equipes de arte, engenharia, design, áudio e produção para identificar e registrar tarefas de implementação. Exemplo:

  • As equipes de arte podem criar orçamentos de textura e malha de recursos para personagens e ambientes.
  • A engenharia pode determinar checkpoints de memória e desempenho para criar perfis em cada plataforma.
  • O design pode planejar a mecânica do jogo que permite a experiência.
  • Especialistas em áudio podem analisar os requisitos de continuidade sonora entre sons espaciais de interface, 2D e 3D.
  • A produção pode comunicar os requisitos de lançamento e manter a equipe alinhada e no caminho certo.

Design para dispositivos móveis

O desenvolvimento de aplicativos para plataformas móveis envolve considerações específicas, como:

  • Proporções de tela variáveis
  • Consumo de energia
  • Limitação térmica e do processador
  • Entrada por toque
  • Desenvolvimento multiplataforma
  • APIs gráficas (Vulkan ou OpenGL ES)

Para detalhes sobre considerações exclusivas do design para dispositivos móveis, consulte Desenvolvimento para Android no Unity do Unity e a Academia do Google Play.

Desenvolver e testar

Na fase de desenvolvimento e teste, você cria o jogo e faz testes e preparação para o pré-lançamento. Você faz alguns testes internos limitados no Google Play para se preparar para atender aos requisitos de lançamento. Você refina sua estratégia de implantação e organiza os recursos no Unity com base nos sistemas Play Asset Delivery e Addressables do Unity.

As seções a seguir descrevem ferramentas e técnicas do Unity projetadas para ajudar você a desenvolver para Android.

Renderização

A renderização é o processo de desenhar os recursos 3D e 2D da sua cena do Unity na tela. Embora o mecanismo Unity processe a renderização, é importante considerar alguns fatores para a plataforma Android.

Texturas

Determine se você precisa dos maiores tamanhos de textura com base nos dispositivos de destino. Ao criar um perfil de alocação de memória, analise a economia potencial de mudar o tamanho da textura de destino.

Tempo para a renderização do frame

Para evitar o superaquecimento em dispositivos Android, defina valores de tempo para a renderização do frame abaixo de 21 milissegundos em média. Às vezes, como durante o carregamento ou experiências cinematográficas curtas, os tempos de frame podem exceder 21 milissegundos, mas você deve ficar abaixo do limite de 21 milissegundos para a experiência principal do jogo.

Em plataformas móveis, a VSync forçada limita a taxa de frames se você não atingir a meta mínima. Por exemplo, em uma atualização de tela de 60 Hz, se você não atingir 60 fps, o jogo será limitado a 30. Se não atingir 30, será limitado a 15.

Muitos dispositivos Android são enviados com taxas de atualização de tela de 60 Hz e 120 Hz. Pondere os benefícios de segmentar tempos de frame muito menores (10 ms para atualização de 60 Hz e 5 ms para 120 Hz) sem arriscar a limitação térmica e o consumo de bateria para taxas de renderização mais altas.

Para definir uma taxa de frames específica no seu jogo no Unity, use Application.targetFrameRate.

A biblioteca Frame Pacing do Android ajuda você a renderizar de maneira suave quando o aplicativo leva mais tempo para apresentar o próximo frame do que a taxa de atualização da tela exige. Para as versões 2021 e mais recentes do Unity, ativar o ritmo de frames do Android define a taxa de atualização da tela como a melhor correspondência para a frame rate desejada. Isso garante que o jogo não gaste energia da bateria em atualizações desnecessárias da tela.

Para ativar a biblioteca, em Configurações do projeto > Jogador, em Configurações para Android, marque a caixa de seleção Ritmo de frame otimizado.

Caixa de diálogo mostrando "Configurações do projeto > Configurações do player > Ritmo de frame otimizado"
Figura 1. O Optimized Frame Pacing está disponível em Player Settings no Unity 2019.2 e versões mais recentes.

Vulkan API

O Vulkan é uma API multiplataforma de gráficos 3D de alta performance com baixa sobrecarga em comparação com o OpenGL ES. O Unity pode usar o Vulkan de duas maneiras diferentes.

API Auto Graphics

É possível usar a API Auto Graphics com o Vulkan, mas isso pode ter comportamentos diferentes dependendo da versão do Unity instalada. Para selecionar essa opção, navegue até Configurações do projeto > Player > Renderização.

Considere o seguinte ao escolher a versão do Unity a ser usada:

  • O Unity 2021.1 e versões anteriores não oferecem suporte ao Vulkan com a API Auto Graphics. O Unity tenta usar o OpenGL ES 3.2. Se o dispositivo não for compatível com o OpenGL ES 3.2, o Unity vai usar o OpenGL ES 3.1, 3.0 ou 2.0, nessa ordem.
  • O Unity 2021.2 e versões mais recentes usam o Vulkan primeiro. Se o dispositivo não for compatível com Vulkan, o Unity vai usar o OpenGL ES 3.2, 3.1, 3.0 ou 2.0.
Configurações do projeto > Configurações do player > Renderização > API de gráficos automática
Figura 2. Configuração automática da API Graphics.

APIs gráficas manuais

Como alternativa, você pode ativar o Vulkan manualmente desativando a API gráfica automática. Se você estiver usando o Unity 2021.1 ou uma versão anterior, essa será a única maneira de usar o Vulkan.

Se o Vulkan estiver em uma posição mais alta na lista do que o OpenGL ES, o Unity tentará usar o Vulkan primeiro. Se o dispositivo não for compatível com Vulkan, o Unity será executado com OpenGL ES. Consulte Começar a usar o Vulkan para informações detalhadas sobre o Vulkan no Android, como usar APIs de gráficos modernas e otimizar o desempenho do jogo.

Configurações do projeto > Configurações do player > Renderização > APIs de gráficos
Figura 3. Defina manualmente as APIs gráficas quando a API Auto Graphics estiver desativada. A Vulkan é a primeira opção. O Unity volta para o OpenGL ES 3.0.

Chamadas de desenho

Tudo o que é mostrado na tela está associado a uma ou mais chamadas de desenho. Em plataformas móveis, otimize e reduza o número de chamadas de desenho que você envia para a unidade de processamento gráfico (GPU).

Pense nas chamadas de desenho como carros alinhados em um semáforo. Depois que o semáforo fica verde, um certo número de carros pode passar antes que ele mude. Quando a luz fica amarela, você atingiu o tempo de frame ideal (21 milissegundos). Quando ela fica vermelha, você atingiu o limite de 33 milissegundos. Qualquer coisa além disso afeta o próximo frame de renderização, e a taxa de frames resultante é menor que a meta de 30 fps.

Para saber como melhorar o desempenho da chamada de desenho no seu jogo, consulte o artigo sobre lotes do suporte do Unity.

Sombras

As chamadas de desenho de projeção de sombras podem ser as mais intensivas em GPU, consumindo a maior parte do tempo de GPU, mesmo em ambientes simples. Para reduzir o custo das chamadas de desenho de projeção de sombras, use sombras nítidas em vez de suaves. Se isso ainda for muito caro para dispositivos de baixo custo, considere usar sombras de blob em vez de sombras fortes.

Textura

O formato de compactação de textura recomendado para texturas RGB e RGBA no Android é o ASTC. No Unity, a opção mínima de compactação de textura que você deve usar no Android é ETC2. É possível voltar para o ETC2 como backup do ASTC em Configurações de build do Unity.

Confira uma lista completa de formatos compatíveis por plataforma na documentação do Unity em Manual: Recommended, default, and supported texture formats, by platform (em inglês).

Interface do usuário e proporções

Use a ferramenta Simulador de dispositivo do Unity para visualizar várias resoluções de tela, orientações e proporções de tela diretamente no Unity Editor. Você pode alternar entre a visualização de jogo e a visualização do simulador de dispositivo.

Confira uma prévia da ferramenta em Simule seu jogo com o Simulador de dispositivo no Unity!.

Figura 4. Simulador de dispositivo executando o Trivial Kart.

O código-fonte do Trivial Kart está no repositório games-samples do GitHub.

Para verificar rapidamente o layout e a correção dos elementos da tela de IU na visualização do simulador de dispositivo, selecione as opções de dispositivo no menu suspenso:

Configurações do projeto > Configurações do player > Ritmo de frame otimizado
Figura 5. O Simulador de dispositivo permite mudar de dispositivo no editor para que você possa identificar problemas de design com antecedência.
Configurações do projeto > Configurações do player > Ritmo de frame otimizado
Figura 6. Marque a caixa Ativar pacotes de pré-lançamento antes de baixar o pacote do simulador de dispositivo.

Para mais técnicas de otimização da interface do Unity, consulte o seguinte tutorial da Unity: Otimizar a interface do Unity.

Física

O mecanismo Nvidia PhysX é integrado ao Unity. As configurações padrão podem ser caras em dispositivos móveis. Por isso, considere o seguinte:

  • Considere o frame rate desejado e defina o intervalo de tempo fixo de acordo. O padrão é definido como 0,02 ms ou 50 Hz. Você pode aumentar para 0,03 ou mais para uma meta de 30 fps.
  • Considere simplificar os colisores de malha e minimizar a matriz de colisão de camada para determinar interações entre objetos de jogo de tipos de camada específicos.

Para informações sobre configurações de física e otimizações para jogos para dispositivos móveis, consulte o e-book Optimize Your Mobile Games da Unity.

Perfil

Os desenvolvedores de apps geralmente ignoram ou não fazem o perfil até que o aplicativo chegue a um ponto de falha crítica. É recomendável agendar um tempo dedicado de criação de perfil no seu processo e usar as seguintes práticas recomendadas:

  • Identifique os principais pontos durante o desenvolvimento em que você pode alocar tempo de criação de perfil, em vez de encaixá-lo aleatoriamente.
  • Salve snapshots de perfil para usar com o Unity Profile Analyzer.
  • Crie um perfil do seu jogo em dispositivos de destino para ter uma ideia precisa de como ele está funcionando no estágio atual de desenvolvimento.
  • Crie perfis de diferentes partes do jogo.
  • Crie um perfil de como os jogadores jogam. Não crie um perfil do jogo apenas quando ele estiver em estado inativo ou em uma tela de pausa.
  • Crie um perfil no modo sustentado depois que o jogo estiver em execução por um tempo para ajudar a encontrar problemas de limitação que podem ocorrer quando os dispositivos móveis estão quentes.

É possível usar as seguintes ferramentas de criação de perfil separadamente ou em combinação.

  • Unity Profiler: o Unity Profiler é uma ferramenta de análise de desempenho totalmente integrada que pode ser executada no seu código no Unity Editor e se conectar ao seu dispositivo Android independente executando builds no modo de desenvolvimento.

  • Android GPU Inspector: com o Android GPU Inspector (AGI), é possível realizar a depuração no nível do frame. A AGI também analisa os serviços do sistema, incluindo GPU, CPU, memória, bateria e contadores de GPU.

Para mais detalhes sobre como criar perfis do seu jogo no Unity, assista ao vídeo Introdução à criação de perfis no Unity ou leia o Guia definitivo para criar perfis de jogos do Unity, ambos do Unity.

Gerenciamento de memória

Os processos do Android compartilham a memória disponível no dispositivo de destino. Faça o perfil do uso de memória quando o dispositivo de teste de destino tiver recursos de memória livre suficientes. Faça testes de memória em um ponto consistente do jogo para comparar sessões e tendências de uso de memória de maneira adequada.

Ao trabalhar em scripts escritos em C#, tenha cuidado com o uso de strings, comparações de strings e alocações de objetos relacionados a strings, como arquivos JSON para configurações de jogos. Elas geram alocações de memória frequentes e podem contribuir para a fragmentação.

Considere usar a classe StringBuilder para grandes sequências de manipulação de strings, em vez de concatenação in-loco de strings (como "this" + "is" + "a" + "bad" + "idea" em vez de chamadas de função StringBuilder.Concat()).

Para mais informações sobre strings, consulte Strings e texto na documentação do Unity.

Avalie recursos TextAsset e JSON em relação ao tipo ScriptableObject preferencial. ScriptableObjects processa o armazenamento de dados entre cenas de maneira eficiente e permite modificações no tempo do Editor para o tempo de execução.

Para uma discussão sobre o uso de alternativas ao manipulador JSON padrão para otimização de dispositivos móveis, consulte o artigo A otimização oculta em jogos de rede (link em inglês) no site da Hutch.

Use a API Memory Advice para determinar como é o uso da memória durante a execução. A API expõe um indicador de semáforo para uso de memória alto, normal e baixo. Você pode se inscrever no indicador para receber atualizações ou pesquisar diretamente o status atual. Quando você recebe um sinal vermelho, considere reduzir o pool ou o cache de objetos do jogo. Inclua esse contexto na telemetria do jogo durante as operações ao vivo e na análise das métricas de performance após o lançamento.

Para saber mais sobre a organização da memória em dispositivos Android e como o Unity funciona com ela, assista a Como funciona o uso da memória no Android (do Google I/O '18). O vídeo explica os tipos de problemas de memória e quando o eliminador de pouca memória entra em vigor.

Coleta de lixo

A coleta de lixo em um ambiente de memória gerenciada limpa fragmentos de memória não utilizados que podem ser reciclados para um aplicativo. Siga as práticas recomendadas de coleta de lixo para evitar alocações desnecessárias de recursos de memória.

Por exemplo, crie um pool de objetos de jogo em vez de usar alocações sob demanda (GameObject.Instantiate). Para pools grandes, considere alocar em vários frames para reduzir o risco de o jogo ficar sem resposta em dispositivos Android básicos.

Considere o seguinte snippet de código para uma corrotina simples que é invocada desde o início de um MonoBehaviour:

// Option 1: Bad for memory management - causes allocation each iteration
IEnumerator UpdateEnemyTarget() {
  while (enabled) {
    yield return new WaitForSeconds(1.0f);
    // Some intermittent function check
  }
}

// Option 2: Better for memory management - allocation of yield instruction once, reused each iteration
private YieldInstruction waitForSecond = new WaitForSeconds(1.0f);
IEnumerator BetterUpdateEnemyTarget() {
  while (enabled) {
    yield return waitForSecond;
    // Some other intermittent function
  }
}

Você pode editar o arquivo de modelo MonoBehaviour para remover as funções stub padrão Start() e Update() para não deixar funções vazias inadvertidamente durante o desenvolvimento.

Para conferir uma visão geral da ordem de execução dos eventos do MonoBehaviour, consulte Ordem de execução das funções de evento na documentação do Unity. Para saber mais sobre gerenciamento de memória, consulte o curso Gerenciamento de memória no Unity.

Para dicas de otimização de desempenho de jogos para dispositivos móveis, consulte Otimizar o desempenho do seu jogo para dispositivos móveis: dicas sobre criação de perfis, memória e arquitetura de código dos principais engenheiros da Unity.

Pool de prefabs

Os picos de tempo de frame da CPU são quase totalmente causados pela instanciação de prefabs durante o jogo. Considere pré-aquecer pools de objetos para projéteis, inimigos que podem ser gerados e efeitos visuais antes de entrar no jogo para reduzir ou eliminar os picos de uso da CPU na inicialização. Você pode distribuir outras otimizações em vários "frames de inicialização" durante o carregamento ou sequências de introdução na cena.

Você pode encontrar muitos recursos de pool de terceiros na Unity Asset Store relacionados ao gerenciamento de pool de objetos de jogo. ou criar suas próprias opções. Consulte Introdução ao pool de objetos no Unity Learn.

Entrega de recursos

Há limites para o tamanho do aplicativo quando ele é implantado pela primeira vez no Google Play. Dependendo do tamanho e da natureza do jogo, você pode precisar de alguns ou de todos os recursos (modelos de personagens, ambientes, elementos da interface e assim por diante) para que os jogadores tenham a experiência desejada.

Você pode usar o serviço Play Asset Delivery (PAD) para gerenciar os recursos que seu jogo exige no momento da instalação, acompanhamento rápido ou sob demanda. Os pacotes de recursos do Unity são integrados para oferecer suporte à PAD, e você pode usar a ferramenta para especificar quais elementos são entregues.

Addressables

Configurar recursos dinâmicos, como prefabs, texturas e arquivos de som, no tempo de execução não é mais uma operação complexa se você preparar e revisar o sistema de nomenclatura de Addressables. Os recursos endereçáveis separam a forma como você organiza seu conteúdo de como você cria e carrega seu conteúdo. O sistema Addressables substitui as pastas Resources e os pacotes de recursos para simplificar a forma como você referencia e carrega recursos durante a execução.

Por exemplo, consulte o Projeto de demonstração usando o pacote Addressables no GitHub. Para detalhes sobre o desenvolvimento de Addressables, consulte o Sistema de recursos endereçáveis no blog da Unity.

Com o layout de recursos endereçáveis, há vantagens e desvantagens em agrupar poucos ou muitos recursos em pacotes comuns. Para saber mais sobre o gerenciamento de conteúdo com endereços de destino, consulte Simplifique o gerenciamento de conteúdo com endereços de destino.

Você pode configurar uma demonstração independente e testar os modos de acesso para se familiarizar com o sistema de endereços. Você também pode conferir o projeto de código aberto BuildLayout Explorer para Unity 2019.3 e versões mais recentes e inspecionar o relatório buildlayout.txt gerado por Addressables.

Os recursos do Chop Chop, um projeto aberto do Unity, foram empacotados usando o sistema Addressables para todo o carregamento e descarregamento. Consulte Como empacotar conteúdo com recursos endereçáveis | Devlog de projetos abertos para conferir um tutorial sobre a estrutura e a configuração dos pacotes endereçáveis.

No projeto Chop Chop, a única cena carregada por padrão, a cena de inicialização, foi configurada para usar AssetReferences em vez de links diretos para recursos no projeto (cenas, prefabs etc.).

O código-fonte do Unity Open Project: Chop Chop está disponível no GitHub. Embora o projeto não esteja mais em desenvolvimento, o repositório git e a documentação ainda estão disponíveis.

Plug-ins de terceiros

Se você usa plug-ins de terceiros, como os da Unity Asset Store, revise as pastas e remova os recursos desnecessários das pastas Resources. Durante o processo de build, o Unity coleta todos os recursos incluídos nas pastas Resources e os agrupa em um único pacote acessível durante a execução. Isso pode aumentar o tamanho do pacote final e geralmente não é necessário.

Para localizar rapidamente todas as pastas de recursos, pesquise Recursos no painel Projeto. Em seguida, selecione cada um para identificar o que ele contém e se é necessário para o jogo.

Figura 7. Pode haver várias pastas Resources nas pastas baixadas da Unity Asset Store. Limpe-os para evitar que sejam incluídos no pacote do aplicativo.

Publicar e manter

Quando estiver tudo pronto para lançar seu jogo para dispositivos móveis, decida para quem você quer fazer o lançamento, como realizar testes alfa e beta e como monitorar e acompanhar o desempenho após o lançamento.

Analisar o feedback de uma versão limitada

Você pode lançar para um público-alvo limitado e segmentado e realizar testes beta em maior escala ou ativar o jogo para disponibilidade total em todos os mercados. Com um lançamento limitado, é possível ajustar a performance do aplicativo com base em um público ao vivo mais amplo e em uma coleção de dispositivos.

Por exemplo, você pode usar o Android Performance Tuner para Unity e o Google Analytics para Unity e receber insights sobre o desempenho do aplicativo e as tendências dos jogadores, com base nos quais sua equipe de desenvolvimento pode ajustar e enviar atualizações. Você também pode usar os dados de análise para planejar sequências ou jogos relacionados em um gênero semelhante.

Teste Alfa e Beta

Depois de configurar seu perfil de aplicativo no Google Play Console, você pode preparar builds de teste alfa e Beta públicos e distribuí-los a um público limitado para análise antes do lançamento. Ao lançar para um público limitado, você pode resolver os problemas finais com um pool maior de dispositivos e coletar feedback inicial para responder antes de lançar globalmente.

Seus builds do Unity são distribuídos por Android App Bundles. Para mais informações, consulte o Manual: como entregar ao Google Play do Unity, que também descreve as mudanças dos arquivos APK para o formato AAB.

Monitorar e rastrear

Durante a fase de liveops e distribuição do jogo, você pode usar o Android Vitals para ajudar a rastrear problemas de desempenho em dispositivos que você não teve acesso durante o desenvolvimento e o teste. Para mais detalhes, assista a O que há de novo para jogos em alcance e dispositivos e Android vitals.

Muitas vezes, equipes de desenvolvimento maiores têm pipelines de telemetria de jogos exclusivos e personalizados que fornecem métricas relacionadas ao desempenho do dispositivo. Não se esqueça de aproveitar o Android Performance Tuner (APT) e o plug-in correspondente do Unity para ajustar as métricas relacionadas a frame rates, fidelidade gráfica, tempo de carregamento e abandono do carregamento. Siga o guia detalhado em Integrar o Android Performance Tuner ao seu jogo do Unity.

O ciclo de vida do seu jogo não termina depois que você começa a transmitir ao vivo. Monitorar, manter e responder ao desempenho e ao feedback é fundamental para ter usuários satisfeitos, avaliações positivas e a adoção do seu jogo em todos os mercados.