Quando você tem uma idéia de uma nova mecânica de jogo ou até mesmo um conceito interessante - em breve você ficará obcecado por isso com uma imensa vontade de começar a fazer algo. Às vezes, você escreve essas idéias em algum lugar e oferece a elas a chance de iniciar o ciclo completo de desenvolvimento posteriormente. Mas eu me deparei com a ação oposta. Meu jogo atual se tornou um monstro gigante que consome tempo e finanças, e cresceu muito maior do que eu jamais pensei. Então, eu precisei adiar por um tempo. Mas eu não conseguia ficar sem o desenvolvimento do jogo e, no meu tempo livre, comecei a trabalhar no meu novo projeto! Além disso, esse foi bem diferente dos anteriores, porque decidi segmentar para dispositivos móveis. Se você estiver interessado em como esse projeto foi realizado, desde uma pequena ideia até o lançamento final, vamos mergulhar nele!

Claramente, estou falando sobre minha experiência e minha visão, mas muitas coisas seriam comuns para qualquer projeto, e talvez você encontre algumas dicas úteis.
Escultura na base da ideia
A idéia principal era bem simples - vamos fazer um labirinto, um labirinto! Embora você possa encontrar alguns jogos simples nesse gênero na loja, acredito que você deve trazer algo mais para o jogo do que apenas seguir o clichê do gênero. Tenho uma profunda preocupação com o design de jogos em geral, adorando as histórias e experiências completas de aventuras com um começo distinto e um final proeminente. Não pude fazer aqui uma exceção aos meus ideais. Além disso, eu queria uma mecânica de jogo interessante. Minha abordagem foi adicionar outra variável a toda a fuga do conceito de labirinto. E depois de um brainstorming, a nova idéia nasceu. Essa era a corrente e o sistema de comutadores de corrente. Portanto, o movimento do personagem principal é restringido pelo comprimento da cadeia e pelos caminhos que o jogador escolheu. Com isso em mente, você precisará não apenas encontrar a saída, mas também o caminho mais curto possível! E se eu lhe disser que sua corrente é muito curta e você só pode ir além depois de um comutador de corrente que fornecerá o novo ponto de ancoragem e a nova corrente com comprimento diferente. Agora, o jogo começa a ser mais difícil, porque você precisará encontrar a ordem correta desses interruptores dentro do labirinto. E se isso não foi suficiente para você - então vamos adicionar portas, que você precisa abrir com ativadores especiais em algum lugar dentro de um labirinto e depois voltar ainda pensando nos interruptores e na corrente.

Entendendo os limites
Certamente, não foi fácil planejar todos esses recursos com antecedência. Alguns deles foram feitos devido a limitações técnicas e gerenciamento rigoroso do tempo. O objetivo era torná-lo o mais rápido possível e não aumentar drasticamente a complexidade de todos os aspectos do jogo no processo de desenvolvimento. A corrente foi feita usando as articulações e não pôde ser processada pela física do motor de jogo depois de algum tempo, literalmente explodindo em pedaços. Então, eu precisava restringir seu comprimento e ainda ser capaz de continuar o caminho. De fato, havia uma solução para escrever scripts em cadeia totalmente personalizados, falsificando a física real, mas essa era uma tarefa demorada que eu não podia pagar.
Ainda assim, eu consegui manter um pouco de comprimento para a corrente, e o pensamento inicial era fazer pequenas câmaras de labirinto onde você precisa encontrar o caminho mais curto, mas isso não foi suficiente. Se o jogo inteiro foi assim, será bastante entediante, porque você tem apenas uma tarefa repetitiva sem alterar a experiência ou mesmo a dificuldade. Ainda assim, essas idéias fizeram parte do jogo final.
Inspiração e pensamentos: Experiência de prototipagem
Depois de alguns protótipos, ficou claro que os labirintos, onde você precisa se desviar da rota mais curta e até ter algum retorno, eram os mais interessantes. Portanto, a decisão final foi adicionar seções de jogo separadas uma após a outra - os grandes labirintos com vários switches e pequenos labirintos com a menor maneira possível. Todos eles se conectaram com alguns corredores vazios para libertar a mente do jogador da sensação de constante desafio. Mas no momento dos testes surgiu outra ideia que forneceu um novo pensamento crítico - precisamos de mais mecânica de jogo. Porque estar nas mesmas paredes desses labirintos um após o outro, mesmo com alguma curva de dificuldade, ainda não era suficiente para manter a atenção dos jogadores.
Para aumentar o tempo de atenção, não esqueça que o jogo é direcionado para a plataforma Mobile. Nunca o projete para ter longas sessões de jogo sem interrupção. Decidi fazer salvamentos em cada troca de corrente, para que o jogador possa sair a qualquer momento e nunca ficar longe da sessão do jogo anterior. Claro, estou tendo algumas intenções de como o jogo deve ser jogado, mas minha sessão ininterrupta máxima prevista é de cerca de 5 minutos. Isso inclui apenas cenas em que a música é apresentada.
Voltando à variedade mecânica, adicionei quebra-cabeças envolvendo correntes como ferramenta para resolvê-los. É uma ótima solução de design de jogo - reutilizar objetos mundiais que você já conhece como a nova ferramenta de propósito.

Havia várias idéias de muitos quebra-cabeças diferentes com essa nova ferramenta, mas a decisão final foi implementar apenas um tipo com variação em sua dificuldade. Se você acha que seu jogo precisa de todas as suas novas idéias e variações, mas não tem tempo para implementá-las, pare! Seu objetivo aqui é terminar o jogo. No caso, você não implementará esses recursos agora, nem mesmo até o final do ciclo de desenvolvimento - a única solução é atualizar o jogo mais tarde e a segunda e mais radical - criar um jogo completamente novo mais tarde com todos os recursos ausentes. recursos. Se você tiver o produto principal em suas mãos, seria mais fácil continuar. Só não deixe os recursos para interromper o lançamento. Faça isso apenas se eles forem a parte crítica do produto completo que adiciona uma experiência única a ele e você não pode imaginar o jogo sem esses recursos.
Examine rapidamente as coisas técnicas: como o mundo foi construído
A corrente foi feita com juntas configuráveis com movimento bloqueado em todos os eixos. Instanciado como segmentos de cadeia, com 4 corpos rígidos conectados por 4 juntas em um segmento. As fontes da cadeia são semelhantes aos poços. Para o bom funcionamento, apenas removi os segmentos que estavam sob a superfície e instalei novos quando a última junta do segmento se aproximou da superfície. Além disso, o corpo rígido da última junta foi restringido a ter movimento vertical apenas para permanecer como âncora. Além disso, o cabo possui material de colisão especial sem muito atrito.

O jogador foi feito com um corpo rígido que possui um seguimento simples para direcionar o script para movê-lo. E o alvo tem um agente de navegação. Então, quando movemos o joystick, movemos o alvo apenas com o sistema de navegação, e o corpo rígido do jogador tentou alcançar o alvo pela força física. Se tivéssemos apenas o sistema de navegação, a corrente não poderia pará-lo e o jogador agia exatamente como o corpo rígido cinemático com controle absoluto de posição. O único problema com a aplicação de força é que, com a contagem variável de segmentos de cadeia, também temos a variável em massa anexada ao jogador. Então, se você tiver muita massa no limite final da cadeia, ela explodirá. Caso contrário, o jogador seria arrastado para trás pela corrente ou não se moveria. Então apliquei uma alteração na massa em relação ao comprimento real da corrente. Mas a solução mais interessante contra a explosão em cadeia - a desestabilização de sua física, foi limitar a velocidade máxima em suas partes singulares por um script personalizado.
O próprio labirinto era feito de labirintos menores, quebra-cabeças e corredores que os conectavam a todos. Quando comecei a desenhar esses labirintos - peguei minha caneta e papel quadriculado e comecei a desenhá-los parede a parede. Mas, depois de inúmeras mudanças devido à verdadeira prototipagem e como ela foi afetada pela cadeia, eu tinha certeza de que era a maneira mais ineficaz de fazer as coisas. Então, eu criei uma janela de editor personalizada para meus labirintos. Era exatamente como a caneta e o papel, mas com um estado salvo que poderia gerar o labirinto completo a partir de paredes, pisos e fontes pré-fabricadas de correntes. Também adicionei controle sobre o comprimento das fontes da cadeia e foi a solução completa para o problema do labirinto de projeto.

Lembre-se de que, para instanciar o tempo do editor, você deve usar os métodos do
Prefab Utility e não o
Instantiate comum, pois, caso contrário, os clones dos objetos pré-fabricados serão desanexados do pré-fabricado original.
Pós-processamento
É uma preferência pessoal, mas adoro o pós-processamento e não podia imaginar meu jogo sem ele.
Bloom é uma opção obrigatória, mas também gosto de
Profundidade de campo e da solução simples
FXAA . Com a nova pilha de pós-processamento, as etapas para implementá-la corretamente eram bastante simples. Também adicionei a esfera de gatilho acima do jogador, que tinha outro perfil com o efeito
Aberração cromática , que passou para o jogador no momento da troca. Além disso, o perfil separado para o final cinematográfico. Mas, após uma das atualizações,
tudo parou de funcionar e, depois de testar no dispositivo,
deparei- me
com outro problema . Com um pouco de
RenderDoc , o motivo foi claro e imediatamente corrigido, mas espero que possamos ver a correção oficial da equipe do Unity.
Início da estrada de otimizações
Quando o jogo estava quase pronto, e a reprodução inicial no meu dispositivo foi concluída, tentei iniciar o jogo em um dispositivo não tão poderoso que eu tinha anteriormente no desenvolvimento. Isso foi patético. Eu notei pequenas quedas no meu dispositivo antes, mas depois dos passos iniciais para solucionar o problema de superaquecimento, pensei que nunca veria uma gagueira tão dramática.
Para o superaquecimento - as etapas são diretas, eu não precisava de 60fps, então bloqueado para 30. Além disso, um escalonador de resolução personalizado que limitava o tamanho da tela curta a 720p. Outro truque com a mudança de horário no
Time Manager não funcionou para mim, devido à dependência de cálculos físicos pesados. Quando tentei aumentar o tempo, a corrente explodiu com bastante frequência atingindo seus limites.
Todo esse trabalho foi feito antes do teste de dispositivo fraco. Então eu comecei a olhar mais de perto no criador de perfil.
Um ponto interessante foi que eu tinha muitas fontes de áudio ativadas o tempo todo. Mas nunca precisei de todos eles simultaneamente, e os eventos de tocá-los foram bastante determinísticos. Acabei com quase todas as fontes desativadas por padrão, habilitando-as apenas para a ativação de som necessária e depois desabilitando-as logo após o final do som.
Alguns scripts se beneficiaram de atualizações manuais em vez das proprietárias, especialmente quando eu tinha muitos objetos semelhantes com o mesmo script e um método
Update dentro deles. Apenas renomeie seu método
Update para
ManualUpdate e chame-o de fora. No meu caso, todos os meus quebra-cabeças estavam em cena e eles chamaram seus métodos de atualização, também todos os pilares dentro de cada quebra-cabeça tinham seu próprio método de atualização, e até os gatilhos do pilar tinham seus próprios métodos de atualização. Sem essas múltiplas atualizações automáticas e a chamada manual do método de atualização em todos os objetos de um único local, eu consegui reduzir significativamente a sobrecarga das chamadas de métodos internos do Unity.
A última, mas uma das coisas mais importantes na otimização, é a parte de renderização. Se você deseja enviar seu jogo para celular com shaders
padrão - então você é louco! Talvez em alguns casos raros, com pequena quantidade de materiais e complexidade de variantes de shader pequeno, porque o shader padrão possui muitos deles, você pode realizá-lo enquanto direciona apenas dispositivos de primeira linha. Mas, no meu caso, acabei com quase todos os shaders alterados para usar os personalizados, com base nas variantes de superfície móvel. Mas não encontrei uma boa maneira de simular metal / suavidade com um modelo de iluminação personalizado; portanto, apenas materiais metálicos brilhantes terminaram com sombreador padrão. No entanto, se você vir as versões compiladas, não será necessário escolher a correta quando você tiver mais de 190 operações no shader padrão versus menos de 70 em uma personalizada. Lembre-se de que a abordagem
PBR , que inclui o shader padrão padrão, é realmente intensiva em
GPU e complexa demais para dispositivos móveis. Você deve usar shaders especificamente otimizados para dispositivos móveis desde o início do desenvolvimento. Faça-os você mesmo ou use aqueles que são incorporados ao Unity.
A próxima parada: depurador de quadros
A próxima dica de desempenho é verificar o depurador de quadros em busca de quebras de lotes incomuns. Ou apenas para ver quantas chamadas você precisa para renderizar a cena inteira.
Tive um comportamento estranho quando o depurador revelou que alguns objetos renderizados quebram sequencialmente o lote, apesar de terem o mesmo material. Até a mensagem não era clara porque dizia que eu tinha fontes de luz diferentes para elas. Mas toda a cena usou a única fonte de luz direcional! Esses objetos tinham o mesmo material e todas as suas propriedades eram as mesmas! Mas nem todos eles, porque eu estava olhando apenas para as propriedades de material e renderização. O verdadeiro motivo foi que mudei minha fonte de luz para seleção personalizada por camadas. E o objeto de sequência de quebra estava em uma camada específica que simplesmente não estava acesa.
De qualquer forma, às vezes o depurador de quadros mostra uma ordem estranha de renderização que interrompe o lote. Algumas dessas ocorrências eram ridículas e a correção manual da fila de renderização de material ajudou a resolvê-la.
Além disso, o depurador de quadros mostrou que, apesar de ter quase todos os objetos renderizados como estáticos, eu tinha muitos lotes que não faziam sentido. Só porque eu tinha tantos deles, que o doseador fez muitas malhas estáticas e nunca tentou agrupá-los por posição. Nesse caso, eu tinha minhas paredes de labirinto em uma tela composta de 5 ou 6 lotes diferentes. Mas aqueles feitos do mesmo material! Acabei adicionando apenas objetos de piso como estáticos, porque todos eles chegaram a uma malha em lote. E o restante ficou com as paredes agrupadas dinamicamente, sem problemas, com a fila de materiais corrigida para uma única. O lote dinâmico causa algum impacto na
CPU , mas, no meu caso, a diferença mesmo no dispositivo fraco era apenas marginal em comparação com o lote estático personalizado por meio do
StaticBatchingUtility . E o lote dinâmico foi ainda mais eficaz para mim em salvar chamadas de draw do que uma estática personalizada nos casos extremos.
As outras coisas que o depurador de quadros apontou foram as sombras e as cascatas. Se você estiver curioso, toda cascata de sombras é praticamente outra passagem de sombra para a tela inteira. Portanto, se você tiver vários lotes no shadowpass, multiplique esse número pelo número de cascatas que possui. Acabei de desativar as cascatas após essa descoberta. Mas eu ainda precisava de sombras decentes em tempo real e acabei ajustando a distância de recorte da câmera e mudando para as sombras de ajuste próximo em qualidade média. Eu sei que eles não são os mais bonitos, mas era muito melhor do que ter estáveis com resolução inferior ou sem sombras.
O último dentro do depurador de quadros e o desempenho é o pós-processamento. Mesmo com apenas alguns efeitos ativados, esses eram quase os mais pesados - Bloom e Profundidade de Campo. Ambos usaram amostras do quadro em baixa resolução, mas com diferentes texturas de entrada e diferentes filtros de sombreamento. Eu já havia mudado o
Bloom para usar o filtro quadrado de modo rápido dentro do shader, em vez de uma circular mais complexa. Infelizmente isso não foi suficiente. Então, acabei alterando o fator de escala da resolução no buffer de quadros inicial do efeito. Ele usa meia resolução por padrão, mas vi grandes melhorias quando usado não a meia resolução, mas apenas um terço dela. Diminuir ainda mais para um quarto quase não teve efeito com outros visuais degradantes. Portanto, minha solução para pós-processamento no celular é um terço! Ou usando soluções completamente personalizadas.
Quase lá: polonês!
Naturalmente, todo projeto é único, e você deve pensar no seu em particular, mas aqui eu só queria mostrar quais partes eu decidi colocar no meu processo de polimento e por quê.
Os primeiros passos do polimento foram feitos logo após o primeiro teste alfa e antes das otimizações de desempenho. Com o feedback inicial, adicionei recursos menores que estavam quase lá, mas ainda não se destacaram.
O primeiro era o piso colorido, que eu tinha uma visão desde o início do desenvolvimento, mas no processo atual todos os paletes que eu conseguia pensar pareciam meio antinaturais. Então, na primeira rodada, terminei apenas com o gradiente de cores do claro ao escuro durante todo o caminho do jogo. Mas o teste mostrou que isso não era suficiente. Com um pouco de dificuldade em todas as combinações de cores, a certa foi criada. Mesmo esse pequeno detalhe visual teve um impacto notável no sentimento geral do jogo. Com a distinção entre estágios, você tinha mais senso de realização e progresso.
A outra noção era o desejo de ter uma sensação mais divertida e dinâmica do jogador. Mesmo que eu não fosse fã disso no começo, mas consegui encontrar um pequeno compromisso que parecia melhor, mas que não revidou a sensação calma do personagem. Esse foi o travamento do cristal dentro do aparelho para nunca girar em relação ao mundo. Mas para o jogador que parecia o cristal interno girava a cada movimento. Na verdade, quando eu era criança, eu tinha uma bola que continha outra. Essa parte interna flutuava em uma pequena quantidade de substância líquida que não era perceptível, e quando você a rolava na superfície, parecia que ela pairava sem rolar. Esse recurso me lembrou um pouco desse sentimento único.
Depois de todas as mudanças no desempenho, o jogo começou a funcionar como planejado, mesmo naquele dispositivo de baixo desempenho. Não é o mais baixo, mas isso foi bom para mim. E então eu tenho tempo para pensar em outros recursos que terão impacto no sentimento geral do jogo e foram críticos para minha visão.
O primeiro estava deixando os arranhões no chão e foi rapidamente implementado como piscina de decalques. Mesmo que você nunca o veja, isso definitivamente contribui para a atmosfera do labirinto.
A segunda característica que afetou a sensação geral nos meus olhos foram algumas pedras nos corredores que deveriam ter adicionado mais dinâmica ao mundo frio e vazio. Essa foi apenas a visão, e também sem nenhum problema implementado no jogo final. Ele apresentava uma sensação estranhamente satisfatória toda vez que você vê aquelas pequenas pedras caindo no escuro.
Ponto de lançamento
Depois que todos os testes estiverem concluídos e você estiver satisfeito com o polimento, estará pronto para o lançamento!
Para mim, o objetivo principal desde o início era fazer a experiência de um jogador sem distrações. Portanto, a decisão foi clara: sem anúncios, sem compras no jogo, sem caixas de itens. Para esses recursos, você deve projetar o jogo desde o início para contar com eles de forma a ser uma parte essencial da experiência. No meu caso, eu sabia que o jogo inteiro para um jogador médio levaria cerca de três a quatro horas de experiência. Assim, coloquei um preço fixo razoável e deixei para lá. Não se passou tempo suficiente desde o lançamento para pensar em vendas substanciais e também sem qualquer promoção ainda. Mas como desenvolvedor, estou bastante satisfeito com o jogo e, se alguém quiser, é um sucesso para mim.
PS
No final, alguns recursos foram deixados para trás. Particularmente ainda é preciso fazer para completar a atmosfera do jogo, mas não é algo que mude radicalmente a experiência, de modo que isso pode ser feito como uma atualização pós-lançamento. O restante dos recursos nunca poderia sair. Infelizmente para mim, tenho uma ideia interessante no momento de testar o lançamento final. Acho que isso aconteceu porque houve uma pausa de uma semana no desenvolvimento e tenho um novo visual depois de um retorno. Talvez algum dia houvesse o segundo jogo, mas, no momento, todas as idéias aguardarão a hora de trazer de volta o novo ciclo de desenvolvimento.
PPSPor favor, se você encontrar algum erro de digitação ou gramática, envie mensagens pessoais para que eu as corrija.