Minha participação no desenvolvimento do Uncharted 4


Após o lançamento do Uncharted 4, já posso falar sobre o que trabalhei neste projeto. Basicamente, desenvolvi a IA para os companheiros de equipe do jogador no modo single-player e assistentes no multiplayer, e também trabalhei um pouco na lógica do jogo. Omitirei os aspectos que não chegaram ao jogo final e alguns pequenos detalhes.

Então, prosseguimos:

Sistema de postagem


Antes de começar, gostaria de falar sobre o sistema de postagem usado pelo NPC. Não trabalhei na lógica central deste sistema, mas ajudei a escrever o código do cliente que o usava.

As postagens são posições discretas no espaço de navegação do NPC, criadas principalmente por ferramentas de desenvolvimento e colocadas manualmente pelos designers. Dependendo de nossas necessidades, poderíamos criar seletores de postagem diferentes para avaliar diferentes tipos de postagens (por exemplo, um seletor de postagens furtivas, um seletor de post de combate) e selecionar o post de maior classificação para enviar NPCs para lá.


Companheiros de equipe seguindo o jogador


O sistema para seguir os companheiros de equipe do jogador é retirado de The Last of Us .

A idéia principal era que os colegas escolhessem ao redor do jogador as posições a serem seguidas. Essas posições em potencial divergem do jogador e devem satisfazer as seguintes verificações quanto à liberdade do caminho reto: do jogador para a posição, da posição para a posição projetada para a frente, da posição projetada para a frente para o jogador.


Ao contrário de The Last of Us, Uncharted 4 tem um aspecto de escalada. Para integrar a escalada no sistema de acompanhamento do jogador, adicionamos um seletor de escalada que seleciona os pontos nos quais os companheiros de equipe devem se mover quando o jogador está escalando as rochas.


Essa tarefa foi mais difícil do que esperávamos. Não bastava pedir aos parceiros que usassem a lógica usual de seguir quando o jogador não subir e mudar de post quando o jogador rastejar ao longo da parede. Se um jogador alterna rapidamente entre um estado normal e escalada, os parceiros começam a oscilar entre esses dois estados. Portanto, adicionamos histerese: agora os parceiros podem mudar de estado apenas quando o jogador mudou de estado e se mudou o suficiente nesse estado. Em geral, a histerese é uma boa técnica para evitar "saltos comportamentais".

Correndo à frente companheiros de equipe


Queríamos que os colegas de equipe mostrassem ao jogador o caminho em alguns pontos do jogo. Esse sistema foi retirado de The Last of Us e aprimorado: os projetistas usavam splines para delinear os caminhos comuns pelos quais os companheiros de equipe deveriam levar o jogador adiante.


Se havia vários caminhos no nível, os designers organizaram vários splines e os ativaram / desativaram usando um script.


A posição do jogador é projetada no spline e o ponto de referência de rastreamento do jogador está na frente, a uma distância personalizável pelos designers. Quando esse ponto de referência de rastreamento passa pelo ponto de referência da spline, marcado como um ponto de espera, o parceiro começa a se mover para outro ponto de espera. Se o jogador decidir voltar, o parceiro começará a retornar somente quando o ponto de rastreamento do suporte estiver muito longe do ponto de espera mais distante, passado no processo do último movimento para frente. Assim, a histerese se forma novamente, evitando uma mudança acentuada de estado.

Também construímos na velocidade dinâmica do sistema de rastreamento. Com base na distância entre o parceiro e o jogador, os "planos de velocidade" estão localizados ao longo do spline. Os NPCs podem usar três tipos de movimento: caminhar, correr e correr. Dependendo do plano de velocidade em que o jogador está localizado, o parceiro seleciona o tipo de movimento apropriado para manter a distância necessária para o jogador. De acordo com sua visão, os projetistas podem ativar e desativar os planos de velocidade. Além disso, dependendo da distância do jogador, a velocidade de animação do movimento do parceiro aumenta ou diminui ligeiramente para evitar uma mudança acentuada na velocidade do movimento ao alternar entre tipos de movimento.


Compartilhamento de Abrigos


Em The Last of Us, o jogador pode se mover em relação ao seu parceiro, enquanto permanece na cobertura. Isso é chamado de abrigo geral.


Em The Last of Us, Joel está mais distante da parede do abrigo que Ellie ou Tess, e isso é lógico, porque eles são menores que Joel. Mas para Nate, Sam, Sally e Elena, isso pareceria antinatural, porque eles têm quase a mesma altura. Além disso, Uncharted 4 é um jogo muito mais rápido, e se Nate estender os braços se movendo atrás de um obstáculo, isso arruinará a suavidade do movimento. Portanto, decidimos que os parceiros simplesmente se apoiariam na parede do abrigo, e Nate se curvaria um pouco ao redor deles ao se mover.


Aqui usamos uma lógica muito simples. Se a posição projetada do jogador, levando em consideração sua velocidade, cair em uma borda retangular ao redor do posto de abrigo do parceiro, o parceiro concluirá o comportamento atual atrás do obstáculo e será pressionado contra a parede do abrigo.


Assistentes médicos


Os assistentes médicos no modo multiusuário exigem um comportamento completamente novo que não está disponível no modo monousuário: eles devem ressuscitar amigos derrotados e copiar o comportamento dos jogadores atrás de abrigos.


Os médicos tentam imitar o comportamento dos jogadores atrás de abrigos e ficar o mais próximo possível do jogador, de modo que, se um jogador se machucar, ele estará próximo e o ressuscitará. Se o aliado mais próximo for ferido, ele também o ressuscitará, desde que o jogador ainda esteja vivo. Se o jogador estiver equipado com o RevivePak mod para médicos, antes de correrem para os aliados para ressurreição, eles tentarão lançar o RevivePak para os aliados (várias ressurreições realizadas simultaneamente aceleram o processo de ressurreição); ao lançar RevivePak, a lógica de lançamento de granadas é usada, em particular, verificando a liberdade da trajetória e reproduzindo a animação, apenas granadas são substituídas por RevivePak.


Grama para discrição


A nova mecânica de Uncharted 4 também é um movimento oculto na grama. Para implementá-lo, precisávamos de alguma forma marcar o ambiente para que a lógica de jogo do jogador descobrisse se ele estava na grama. Inicialmente, queríamos que os artistas de segundo plano marcassem as superfícies das colisões de grama no Maya, mas descobrimos que a comunicação entre artistas e designers diminuiu muito a iteração. Portanto, criamos outra maneira de marcar áreas com grama para serem furtivas. Especialmente para designers, uma nova tag de grama para discrição foi adicionada ao editor para que eles possam marcar com precisão os intervalos de navegação que o jogador deve considerar grama para discrição. Graças a essas informações adicionais, também pudemos avaliar postagens furtivas, dependendo se elas estão na grama ou não. Isso acabou sendo útil para companheiros de equipe se movendo quando o jogador está no modo furtivo.


Órgãos sensoriais


Como, ao contrário de The Last of Us, em Uncharted 4, não há modo de escuta, tivemos que, de alguma forma, informar o jogador sobre ameaças iminentes, para que a localização desconhecida dos inimigos não o incomodasse. Usando dados sobre a percepção dos inimigos, adicionamos indicadores de ameaça em cores que informam ao jogador que o inimigo logo o notará como um fator de distração (indicador branco), o perceberá como um fator de distração (indicador amarelo) e plenamente consciente de sua presença (indicador laranja). Além disso, fizemos o indicador de ameaça amplificar o ruído de fundo para aumentar a tensão e emitir um sinal alto quando o inimigo entendeu completamente a presença do jogador, como em The Last of Us.


Pesquisa


Esta é a última parte importante da jogabilidade, do qual participei antes do jogo chegar ao "ouro". Normalmente, não participo de reuniões formais na Naughty Dog, mas alguns meses antes do “ouro” tivemos pelo menos uma reunião por semana, sob a direção de Bruce Streley ou Neil Drackmann . As reuniões foram dedicadas ao jogo de IA. Depois de quase todas essas reuniões, havia algo no sistema de pesquisa para alteração ou processamento. Antes de lançar o jogo final, passamos por vários estágios de iterações.

Existem dois aspectos que distraem os inimigos e os incentivam a explorar: a presença do jogador e os cadáveres. Quando o inimigo detecta uma distração, ele tenta atrair o aliado mais próximo para explorar sua causa juntos. Um inimigo mais próximo se torna um explorador e o segundo um observador. Um inimigo que encontra uma distração pode se tornar um pesquisador ou observador, e preparamos para esses casos dois conjuntos diferentes de diálogos ("Há algo lá. Eu irei checá-lo." E "Há algo lá. Vá checá-lo").

Para tornar o início e o final do estudo mais naturais, ajustamos o tempo dos movimentos inimigos e a diminuição dos indicadores dos indicadores de ansiedade, para que alguns pesquisadores não realizassem mecanicamente as mesmas ações ao mesmo tempo.


Se o cadáver é uma distração, o pesquisador pode aprender sobre a presença do jogador e ordenar que todos comecem a procurá-lo, deixando irremediavelmente um estado calmo. Um cadáver descoberto também é marcado para que o jogador tenha a oportunidade de entender o que foi distribuído.


Em alguns níveis de dificuldade, vários estudos, um após o outro, forçam os inimigos a investigar de forma mais agressiva, o que aumenta as chances de encontrar um jogador escondido na grama. Na dificuldade de esmagamento, os inimigos pesquisam agressivamente constantemente.

Visualizações de Diálogo


Esse também é um dos últimos aspectos que lidei no projeto.

As visualizações nas caixas de diálogo são a lógica que faz os personagens reagirem às conversas, por exemplo, olham para outras pessoas e fazem gestos. Em The Last of Us, por meses, os designers anotaram manualmente todas as caixas de diálogo do jogo, marcando momentos de aparência e gestos. Não queríamos repetir isso. Tínhamos várias caixas de diálogo com script que já estavam marcadas manualmente, mas precisávamos de um sistema capaz de lidar com caixas de diálogo sem anotações. Os animadores receberam parâmetros para ajustar a velocidade de rotação da cabeça, o ângulo máximo de rotação da cabeça, a duração do olhar, o tempo das pausas e assim por diante.


Economizando a velocidade do jipe


Desde os estágios iniciais de desenvolvimento, tivemos um problema com a etapa de corrida de jipe ​​no nível da cidade de Madakascar: se o jipe ​​do jogador deriva e ele perdia a velocidade depois de atingir a parede ou o carro do inimigo, o jogador era jogado para longe do comboio e não conseguia concluir o nível.

Eu vim com esta solução: limitou temporariamente a velocidade angular e a mudança na velocidade linear de cima ao colidir com paredes e veículos inimigos. Essa solução simples mostrou-se bastante eficaz - tornou-se muito mais difícil para os jogadores falharem na passagem devido a desvios.



Destruição de veículos


Uncharted 4 introduziu primeiro máquinas controladas por jogadores. Nos jogos anteriores da série, apenas os NPCs podiam dirigir carros, e esses carros se moviam ao longo dos trilhos estriados. Ajudei na implementação da destruição de transporte.

Existem várias maneiras de destruir veículos inimigos: mate o motorista, atire no carro, bata na motocicleta inimiga com seu jipe, bata no jipe ​​do inimigo para derrapá-lo. Dependendo da causa da destruição, foi escolhida uma animação do transporte destruído e de seus passageiros. A animação se mistura com bonecas de pano controladas fisicamente, de modo que a animação de matar transita sem problemas para uma falha fisicamente simulada.


Para destruir motocicletas com um aríete, um retângulo delimitador no plano XZ e um ponto de contato foram usados ​​para selecionar uma das quatro animações direcionadas de destruição do aríete.


No caso de deriva de jipes, é feita uma verificação para ver se o desvio da rotação do jipe ​​da direção de movimento desejada excede o valor limite da deriva.


Ao reproduzir animações de aniquilação, existe a chance de o transporte destruído passar pela parede. Ele usa a esfera projetada (uma esfera projetada como um raio) da posição ideal da máquina ao longo do “trilho”, se não tiver sido destruído, até a posição em que seu corpo está realmente localizado. Se o contato é fixo durante a geração da esfera fundida, a máquina muda na direção do contato normal por uma fração do valor de penetração, portanto, o processo de eliminar a passagem pela parede ocorre gradualmente em vários quadros, o que evita uma mudança acentuada de posição.


Criamos um tipo especial de destruição de veículo chamado dica de morte do veículo. Essas são animações sensíveis ao contexto que interagem com o ambiente. Animadores e designers colocam as posições dessas animações ao longo dos “trilhos” do spline e indicam as janelas de entrada neles nos splines. Se o veículo for destruído dentro desta janela, a animação de destruição correspondente começará a tocar. Inicialmente, essa função foi criada como uma ferramenta para implementar a explosão épica de jipe ​​para a demo, apresentada na E3 em 2015.


Filtro Bayer para pontilhamento


Queríamos nos livrar da geometria de recorte quando a câmera estava muito perto dos objetos do ambiente, principalmente da folhagem. Portanto, decidimos sombrear os pixels no sombreador de pixels com base na proximidade dos pixels da câmera. Não podíamos tirar proveito da transparência porque é muito cara e há folhagem demais. Em vez disso, aplicamos o pontilhamento , combinando a distância do pixel à câmera e o padrão na forma de um filtro Bayer - alguns pixels foram completamente descartados, o que criou a ilusão de transparência.


Nosso filtro Bayer original era a matriz 8 × 8 mostrada nesta página da Wikipedia . Decidi que era muito pequeno e levei à criação de artefatos na forma de listras. Eu queria usar o filtro Bayer 16 × 16, mas na Internet não consegui encontrá-lo em lugar nenhum. Então, tentei fazer engenharia reversa do padrão de filtro Bayer 8 × 8 e notei um padrão recursivo. Eu poderia apenas estudá-lo e escrever uma matriz 16 × 16 manualmente, mas por uma questão de interesse, escrevi uma ferramenta que pode gerar matrizes bayesianas de qualquer potência de duas.


Depois de mudar para o filtro bayesiano 16 × 16, os artefatos com listras diminuíram significativamente.


Atraso no som da explosão


Este é realmente um detalhe muito pequeno, mas eu gostaria de mencionar. Algumas semanas antes da demonstração ser mostrada na E3 em 2015, notei que a explosão da torre foi vista e ouvida ao mesmo tempo, o que era ilógico. Nate e Sally estão muito longe da torre, então eles devem primeiro ver a explosão e depois ouvi-la. Na demo finalizada, a equipe de artistas adicionou um pequeno atraso no som da explosão.


Localização em chinês tradicional


Liguei o texto e as legendas em chinês tradicional apenas duas semanas antes do lançamento do jogo no “ouro” e encontrei erros de tradução. A maioria dos erros foi uma tradução literal do inglês para o chinês tradicional que estava fora de contexto. Decidi que não teria tempo para passar o jogo inteiro, procurando simultaneamente erros de tradução. Portanto, pedi a várias pessoas do departamento de testes que jogassem partes diferentes do jogo em chinês tradicional e assisti ao vídeo gravado da passagem. Isso acabou sendo um passo bastante eficaz; Consegui corrigir todos os erros de tradução detectados e a equipe de localizadores conseguiu corrigi-los antes do prazo.

Isso é tudo


Isso é quase tudo no que eu trabalhei no Uncharted 4, do que vale a pena mencionar. Espero que o artigo tenha sido interessante para você.

Source: https://habr.com/ru/post/pt416593/


All Articles