Introdução
Durante todo este ano, nós demonstramos vários devlogs mais voltados ao lado gráfico do jogo, como mapa e armas, mesmo que no início também mostramos a base de quase todas as mecânicas do gameplay.
Agora estamos procurando trabalhar mais no preenchimento do núcleo do jogo, como a inteligência artificial, para que tenhamos um gameplay básico até o fim deste ano.
Eu gastei quase 1 mês de trabalho no tráfego do jogo, então este devlog está muito mais técnico por conta disto. Bem, nem tudo em game dev são imagens bonitas e bem ilustrativas, nós mostramos isto nos devlogs passados, mas isto é extremamente importante pro progresso do jogo, e eu sei que muitas pessoas estão sentindo falta de ver algo mais “gameplay base”, nós também, mas nos deixem cozinhar que vocês irão se surpreender até o final do ano. Ainda não temos nem 1 ano de trabalho, imagine como ficará daqui 10 anos!
Se você perdeu, veja a postagem anterior:
Resumo das ideias e objetivos deste jogo:
O nosso foco agora foi criar um sistema de tráfego altamente otimizado! E realizar vários trabalhos gráficos, texturas e props, pensando no futuro da reforma do mapa.
Durante os últimos 2 meses de trabalho, nós fizemos isto:
O que foi feito:
- Sistema de tráfego de veículos programado do zero com altíssimo foco em otimização. O meu objetivo era 60 FPS com mais de 100 carros simultâneos, e eu consegui com 3,5 mil.
- Sistema de geração aleatória de veículos que usa inúmeros parâmetros para definir chances de cada modelo ser selecionado no spawn, como o nível de riqueza, gênero do dono, o quão urbano, industrial ou rural, entre vários outros futuros que adicionaremos para que a seleção de veículos tenha personalidade para combinar com o local e dono de uma maneira amigável e modular para a expansão do jogo.
- Para a geração de veículos, cada ponto específico da rua ou estacionamento pode ter definições específicas (por exemplo, um estacionamento na frente de uma loja feminina haverá veículos geralmente femininos) e suporta uma mistura de diferentes pré-configurações para ajustes finos. Todo este sistema já está basicamente pronto pra produção e poderá ter a base reutilizada para pedestres.
- Criado 3 diferentes modelos de semáforos pra veículos, e 1 pra pedestres.
- Shader de pintura de carro com clear coat, fresnel, sheen e imperfeições finas na lataria.
- Nova arma: Pistola Teseu U2e, com suporte à pintura RGB e fácil criação de pinturas estilizadas. Será uma pistola altamente personalizável com acessórios e estilos.
- Nova arma: Submetralhadora artesanal/caseira (especial).
- Nova arma: Motosserra (2 pinturas, ainda não temos animações e mecânica).
- Nova arma: Faca de cozinha de plástico colorida (cores RGB e 3 variações de formatos, especial).
- Nova arma: Faca de pente de memória RAM (especial, somente encontrada no lixo).
- Atualizado o sistema de pássaros, agora é dezenas de vezes mais otimizado, e adicionado pombas urbanas.
- Criado objetos props: Caçamba de entulhos (5 pinturas), saco cobrindo areia, 2 lixeiras de tambor cortado, lixeira móvel, cone de trânsito, poste sinalizador com corrente, lixeira de rua com variações de desenhos entre outros.
- Criado carrinho de reciclagem para catador (ainda não temos animações e mecânica).
- Criado dezenas de novas texturas com base em fotos reais e shadermap inclusos. Principalmente paredes de tijolo e reboco, e trocado inúmeras outras texturas ruins por melhores.
- Melhorado o shader de interior falso parallax. Agora a progressão das luzes acendendo é por shader em vez de separação de mesh (isto deixa o jogo muito mais otimizado), e corrigido a distorção causada em vitrines horizontais (muito notável em jogos como GTA Trilogy).
- Adicionado luzes volumétricas animadas nos postes, para simulação de neblina e poluição.
- Adicionado 2 opções diferentes sistemas de iluminação global no espaço de tela (também erroneamente chamado de “raytracing screen space”) que simula a iluminação indireta de todos os elementos na tela sem impactar muito o desempenho.
- Vários ajustes finos nos gráficos do jogo, e aumentado a resolução dos lightmaps. Agora o gráfico do jogo não tem pretos tão escuros e sombreados do mundo são mais bem definidos.
- Agora 2 pessoas estão encarregadas da modelagem dos veículos. Já temos a base de 8 veículos!
Sistema de tráfego
Eu (Junior_Djjr) tinha um objetivo do jogo ter pelo menos 100 veículos ativos no mapa, sem impactar muito o FPS, pois eu acredito na grande importância que isso tem num jogo como GTA e na imersão de poder vê-los de longe.
O meu objetivo era 60 FPS com mais de 100 carros simultâneos, e eu consegui com 3,5 mil. É um número tão alto que mesmo que eu multiplicasse a cidade em 3, ainda não haveria espaço para todos andarem. “Somente” 600 veículos já preenche a cidade muito bem:
Eu apliquei esta otimização somente na detecção de colisão, isto é, em vez dos veículos distantes usarem física real, eles usam a minha física simulada com detecção de colisão altamente otimizada. Não só isto, a inteligência dos cruzamentos é somente um algoritmo que sabe a situação de cada veículo, não existe nenhuma física por trás, por isso tudo é tão otimizado.
Isto foi possível graças ao Jobs + Burst (DOTS parcial) da Unity, que faz um excelente gerenciamento de memória e gera um código altamente otimizado, além de usar vários núcleos do processador e processar isto em paralelo enquanto o resto do jogo está sendo processado, renderizado e enviado ao monitor, até o próximo frame.
Desta forma, a detecção de colisão do tráfego pode rodar em literalmente dezenas de milhares de veículos com literalmente 0 lag (0 ms de atraso, literalmente, mesmo). O único atraso está na lógica do tráfego (detecções de posição, semáforo, decisões etc), na qual é mais difícil de aplicar, em últimos casos eu posso tentar algo, mas já estou muito feliz com o resultado.
Lembrando que esta detecção de colisão simplificada é usada somente para veículos distantes (um super LOD), mesma coisa para a movimentação simplificada. Para os veículos próximos da tela, será usado física real quando necessário.
Vale lembrar que meu PC não é potente, é mediano, o CPU é um i5 9600KF, então é bem impressionante o que foi possível, mesmo dentro do editor da Unity (ou seja, sem otimização da build), mas para CPUs mais fracas, basta diminuir a distância dos veículos. No vídeo eu mostro numa cidade de mais de 2 quilômetros de extensão, então mesmo cortando pela metade voce ainda terá veículos 1 quilômetro de distância, o que ainda é muita coisa.
Em questão gráfica, também haverá o consumo de recursos para os veículos visíveis na tela, mas somente da GPU, e será usado um LOD extremamente lowpoly e com otimizações de batching ou instancing, além do mais, 600 objetos na tela é quase nada pra um jogo grande, então isto não é um problema, e de noite poderia usar algo como GTA V que em vez de mostrar o modelo dos veículos, mostra somente as luzes deles. Eu também poderia usar o ECS da Unity pra otimizar ainda mais.
Seleção de tráfego
Eu também criei um excelente sistema de spawn aleatório — ou melhor, não aleatório.
Mesmo que seja algo relativamente simples criado em poucos dias, eu fiquei muito feliz com o resultado, principalmente pela lógica modular usada.
Primeiro de tudo, cada rua do mapa, há dados únicos que guardam informações como o nome da rua, quantos veículos estão lá , quantos são esperados que estejam, e uma pré-definição de quais modelos de veículos são esperados naquela rua. Pra quem é modder de GTA SA, pense nisto como uma versão muito mais avançada do “cargrp.dat”.
Nesta pré-definição, eu defino uma curva de chances para cada característica de veículos, por exemplo, o nível de riqueza, então na definição de cada veículo, eu coloco o valor informando isto. Basta uma simples condição que usa a curva e valor para determinar se um veículo pode ser aleatoriamente selecionado para ser spawnado ali — está aí toda a ideia pra quem também estiver criando um jogo de mundo aberto.
Em 1 minuto eu consigo adicionar um novo parâmetro de personalidade pra seleção de tráfego do jogo.
Voltado à inteligência artificial do tráfego, você pode pensar “ah, é só criar carros distantes e está tudo bem”, não! Pois se o jogo tem veículos distantes sendo processados a todo o momento, dirigindo aleatoriamente, em algum momento o Mustang que você criou na praia estará dirigindo no meio de uma favela. Portanto, o mesmo sistema que dita qual veículo criar em cada rua, também dita qual veículo virar pra cada rua, ou seja, se naquela rua não é aceitado carros de luxo, um carro de luxo não decidirá virar pra lá. Isto também resolve problemas onde aleatoriamente pode haver muitos veículos num ponto da cidade e menos em outro, valores de local e hora, e dia da semana, podem ser usados naturalmente para que diminua a quantidade de veículos indo em tais ruas, e a quantidade total de veículos também pode ser ajustada apagando carros distantes não visíveis na tela. Tudo certo!
E como ficam os ajustes finos? Cada waypoint (ponto local específico para dirigir) ou pontos de estacionamento, podem também receber uma pré-definição em vez de usar a da rua, e ainda mais, uma pré-definição adicional com um ajuste de blend (mistura) para misturar os valores.
Você pode não estar entendendo isto muito bem, mas todo esse sistema é tão modular que com um simples arrastar de arquivo eu consigo pegar uma rua já toda bem definida e estruturada, e fazer um blend de configurações pra uma rua onde, por exemplo, há mais lojas femininas, então haverá mais carros e motos femininas no local (ou por exemplo, o estacionamento na frente de uma loja de moda feminina ter várias Honda Biz). Aumentar a quantidade de turistas andando num local ou parando pra olhar a frente de lojas voltadas à turistas. Ou até mesmo calcular a quantidade de lixos nas lixeiras de uma rua e aumentar chances de um catador de lixo virar o cruzamento para aquela rua. Tudo isto sem esforço, com um simples arrastar de arquivo. Eu estou muito feliz com o resultado!
Decisões do tráfego
Por fim, aqui está como funciona este meu sistema de tráfego:
Os modelos dos semáforos foram modelados pelo Zeneric com minha direção e texturas. São baseados nos semáforos da cidade real.
O sistema de semáforo, bem, não há nada demais, é só bloquear um caminho quando está vermelho, mesmo assim fiz um sistema modular que possibilita semáforos direcionais etc.
O real problema: É comum quase todos os cruzamentos de uma cidade não terem semáforos, então os veículos precisam decidir fazer um cruzamento por conta própria.
Jogos com inteligência artificial básica demais, como todos os GTAs da Era 3D, se você remove o semáforo, vira um caos. Então eu prometi pra mim mesmo que farei um bom sistema de cruzamentos, não importe o tempo que leve.
Como citado anteriormente, não existe nenhum cálculo físico, colisão etc. Todas as decisões são tomadas num algoritmo que entende a situação de todos os veículos.
Cada ponto dentro do cruzamento recebe e envia informações se a área está livre para outro veículo atravessar.
Deste modo eu consigo criar cruzamentos otimizados com literalmente qualquer formato, e o veículo pode também “pré-informar” que ele está chegando, para assim dar prioridade à quem vem da direita, e informar ao outro carro pra onde ele irá virar. Em outras palavras, os carros dos NPCs, ou o próprio player, pode dar seta (pisca-alerta), e o outro motorista irá entender a sua decisão e agir conforme!
Pra quem caiu de paraquedas aqui e ainda não sabe, o IMPUNES terá bastante foco em um gameplay de roleplay, além de arcade, portanto o meu objetivo é de que o tráfego do jogo seja algo agradável e dinâmico, onde, se você quiser, você pode obedecer as leis de trânsito, e participar do fluxo, dando seta etc.
O sistema ficou tão legal que eu posso, por exemplo, simular cruzamentos onde não há visibilidade de quem está vindo, assim forçando todos os motoristas a antes pararem pra olhar, ou até mesmo aplicar uma chance baixa de não fazer isto para causar acidentes naturais — afinal, uma inteligência artificial boa não é a perfeita, mas sim, a natural.
O mesmo sistema pode ser facilmente integrado com pedestres, onde eu também fiz semáforo pra eles.
Os primeiros veículos
Depois de muitos meses tentando encontrar pessoas para nos ajudar na modelagem de veículos do jogo, agora temos duas pessoas — ambas muito experientes, mas com pouco tempo livre.
Nós fizemos uma parceria com Heaven Roleplay! Basicamente todos os veículos criados pro Heaven Roleplay serão editados e adaptados pro IMPUNES (exceto veículos de serviço público).
Nós negociamos um preço pra base de cada veículo, e nós pegaremos cada um e editaremos (parodiar para que eles não sejam modelos de veículos reais), remodelaremos várias coisas, como rodas, motor e interior, e adaptaremos às necessidades do nosso jogo.
Heaven Roleplay é um servidor de GTA brasileiro pra MTA:SA criado por várias pessoas próximas por volta da nossa comunidade, e eu posso afirmar, eles realmente estão caprichando e colocando amor neste trabalho, vale a pena acompanhar o trabalho deles, será o verdadeiro GTA brasileiro multiplayer.
Quem está cuidando destes veículos é o RicardoMDS, que tem alta experiência em uma modelagem caprichada e otimizada. No momento temos 3 carros, 1 SUV, 1 van, 1 moto, 1 caminhão baú. Mas nenhum está pronto pro jogo ainda.
E também temos de volta o nosso velho Leonardo Menezes (Leogh). Ele esteve com a gente no início do Projeto 2NTD (de quando a ideia era um jogo topdown pra mobile). Ele começou a modelar um carro esportivo inspirado num Maserati.
Ele é projetista com mais de 1 década de experiência com modelagem, e trabalha com isto. Ele tem alto conhecimento técnico em modelagem 3D, inicialmente a ideia era modelar alguns carros (principalmente esportivos) pro jogo, mas ao entrar no projeto ele se animou e pretende também modelar outras coisas também.
Pintura e pneu
Eu criei um shader de pintura de carro com clear coat, fresnel, sheen e imperfeições finas na lataria (para criar uma distorção no brilho e reflexo, como acontece em carros reais).
Eu gostei bastante do resultado, a ideia é expandir isto pra muito mais, como acúmulo de poeira etc.
Digo o mesmo para os pneus.
Eu gastei vários dias criando manualmente as texturas para as laterais de pneus dos carros, caminhonetes e caminhões do jogo. Tudo é desenhado no Photoshop, inclusive os shadermaps.
Pneu é algo bem mais genérico, mas ainda complexo, então fiz de uma maneira modular com uma textura atlas que o próprio material diz qual variação usar, e a coloração e todos os maps/masks são “packed” numa só textura, assim todos os pneus do jogo, inclusive shadermaps, estão em somente 1 textura. Desnecessariamente otimizado, mas capricho nunca é demais (ou é).
Se aplica 2 overlays de sujeira separados, isto é, sujeira pro centro, e lateral do pneu. A minha ideia é que logo ao começar a dirigir em estrada de terra, o centro do pneu suje, e com o tempo, a lateral suje também, e ao voltar a dirigir fora da terra, o centro limpe, mas a lateral sempre continua suja até que algo limpe ela. Ou seja, como acontece na vida real.
Brasil tem muita mistura do urbano com estradas de terra e poeira, é inclusive comum ver carros sujos pelas ruas, portanto é muito importante que IMPUNES também represente isto.
Mais modelos
Estamos nos aproximando cada vez mais de um foco maior no trabalho do mapa do jogo, com uma reforma para o novo plano de ruas, e criação de props (objetos de decoração) para preencher o ambiente.
Eu adorei o resultado da caçamba de entulho!
Modelado pelo Zeneric com 5 pinturas criadas por mim, o resultado ficou muito natural e bonito. Como quase todos os props, há blend de nível de sujeira. Também pretendemos adicionar um trabalho de caminhão de carregar caçambas no futuro.
Mais alguns props:
A lixeira de rua é um modelo genérico onde, trocando o alpha da textura, eu consigo inúmeras variações de estilos de desenhos. É importante, pois no Brasil há realmente muitos diferentes padrões de desenhos em lixeiras. Ainda faremos mais.
Mas o destaque estão no carrinho de catador:
Ficou incrível! Também modelado pelo Zeneric com minha direção de arte, ficou muito icônico. Obviamente ainda iremos criar objetos pro conteúdo sendo levado dentro dele.
Claro, ainda não temos animações e mecânica de uma pessoa puxando um carrinho de catador (nem sequer temos pedestres ainda), mas isto é algo que faremos no futuro, e o catador será como um personagem, terá toda uma personalidade e lore.
Novas armas
IMPUNES já tem mais de 10 armas prontas (sem contar armas brancas), mas ainda não é o bastante. Zeneric modelou ainda mais armas pro jogo, sempre num padrão triple-A.
Teseu U2e, a pistola mais barata e comum do jogo, altamente personalizável com acessórios (como lanterna e laser), cor RGB e pinturas. Ainda faremos acessórios e pinturas.
Você tem ideias de estilos de pinturas? Nos envie nos comentários nas redes sociais.
Submetralhadora artesanal/caseira. Inspirada no formato de um MAC-10, é uma arma especial (não disponível pra compra).
Uma motosserra é sempre bem vinda em qualquer jogo que contenha violência, no entanto, este jogo não focará em gore, e ainda nem tenho certeza se existirá desmembramento (o sistema de corpo do jogo é muito complexo).
Nós ainda não temos animações e mecânica para uma pessoa usar motosserra, mas por enquanto usaremos como decoração até termos algo funcional. Mas a corrente já é animada com efeito de blur muito legal.
Útil para interiores, ou jogada em lixo, uma faca de cozinha de plástico colorida é uma faca com baixíssimo dano, mas ainda funciona! É uma só, mas com variação de lâmina.
E pra finalizar, uma faca de pente de memória RAM, uma ideia de um seguidor (não lembro o nome). Eu adorei o resultado! Perfeita pra encontrar jogada no lixo.
Puxaram nosso pé que devíamos colocar pintura preto fosco (padrão militar brasileiro) pro fuzil que mostramos no devlog anterior. Faremos, calma!
Iluminação global no espaço de tela
Compramos 2 diferentes assets de screen space global illumination. Umas pessoas devem pensar “mas Unity já não tem?” sim, mas pro HDRP, não URP que nós usamos (e pode demorar pra chegar). E como quase tudo, os assets fazem um trabalho melhor que o nativo da Unity, então vale mais a pena pagar umas dezenas de reais do que esperar a Unity entregar algo aceitável.
Isto possibilita uma iluminação mais realista e completa, por exemplo, o Sol batendo numa parede azul faz refletir o azul no rosto da pessoa, o Sol batendo na pintura do carro faz refletir a cor no chão etc. Também ajuda no ambient occlusion e sombras finas de contato.
Há como aproximar este resultado usando lightmaps direcionais de alta resolução, mas causa complicações pro uso de memória e possibilitar que objetos dinâmicos emitam e recebam luzes também, então esta solução screen-space faz um trabalho mais completo com menos consumo de recursos, além de ter altíssimas possibilidades de ajustes de qualidade para se adequar ao hardware do jogador.
Por um momento imaginei que com isto daria pra remover a iluminação global por lightmaps, mas ao testar, o desempenho dos lightmaps é tão minúsculo que não vale a pena, e os gráficos ficavam muito inferiores. No nosso caso, esta solução funciona melhor como uma camada adicional de iluminação pro jogo — algo que estamos caprichando, nós entendemos a importância de uma boa iluminação.
Luzes volumétricas
Compramos um excelente asset de luzes volumétricas pro jogo (de novo, para compensar o que a Unity não faz).
Eu tive medo disso impactar muito o desempenho do jogo, mas mesmo aplicando na cidade toda o desempenho continuou bom!
Não é só um cone suave, há também uma leve animação de neblina/poluição no centro. Há também como adicionar pequenas partículas de poeira, mas isto dá impacto significativo no desempenho, então usarei só em casos específicos ou gráficos ultra.
Como vocês devem saber, o jogo tem todo um calendário interno com estações do ano etc. No inverno eu pretendo ter madrugadas e manhãs com muita neblina e pessoas vestindo agasalhos. Ficará uma imersão muito legal!
Melhorias nos shaders
Sobre janelas com interiores falsos, eu já havia mostrado num devlog anterior, mas ainda havia aquele problema comum em jogos, como GTA Trilogy, onde um formato mais horizontal, como vitrines, causa muita distorção. Depois de muita pesquisa, eu encontrei uma forma de corrigir isto!
Eu também mudei a forma que as janelas acendem, agora em vez de separar conjuntos de janelas em diferentes meshes, eu defino um valor no vertex color de cada janela, e enviando um valor pro shader, ele define se acende. Está aí mais outra ideia pra quem estiver um jogo com ciclo de tempo.
Antes eu usava o RGB do vertex color para variar a cor de cada janela dos prédios etc. Mas é muito desnecessário, basta definir um degradê, e um só canal do vertex color pode ditar a cor da janela.
Ou seja, com toda essa melhoria, as janelas do jogo ficaram muito mais otimizadas, necessitando muito menos objetos na cena, e menos draw calls, que diminui tanto o uso de CPU quando GPU!
Eu também melhorei o shader de blend de texturas. Agora em vez de um blend linear, posso definir uma mask para uma transição mais natural entre texturas.
E finalmente eu melhorei o efeito de poças de chuva no asfalto, agora não são mais poças redondas, são formadas algumas linhas, como acontece em ruas reais.
Remasterizações continuam
Eu (Junior_Djjr) gastei 2 semanas baixando, comprando, criando, editando, melhorando, trocando etc as texturas do jogo. Em principal, mais de 20 boas texturas de tijolos brasileiros!
Agradecimentos ao Yuri também pode tirar umas fotos das ruas da cidade dele para fazer texturas. Caso mais gente esteja interessada (principalmente se mora em Balneário Camboriú) entre em contato, podemos pagar por serviços de foto pra eu fazer mais texturas pro jogo.
As quadras continuam passando por melhorias, utilizando novas texturas, e mudanças de escala, aumentando espaços de lotes, calçadas etc. O novo modelo atualizado das quadras será colocado no novo planejamento de ruas do jogo.
O que virá em seguida?
Agora pretendo migrar o jogo pra nova versão da Unity. Eu falei no devlog passado mas na verdade só agora a nova versão foi lançada.
Nós também temos um trabalho freelance pra fazer, que consumirá mais algumas semanas, e todos os meses eu reservo uma semana pra eu trabalhar no meu mod Urbanize para os apoiadores.
Ou seja, provavelmente o desenvolvimento do jogo será pausado por 1 mês, então o próximo devlog será só daqui 3 meses.
Depois eu vou querer continuar focando na inteligência artificial dos veículos, e já começamos a trabalhar numa garagem mecânica para tunar carros!
Não sei se ainda no próximo devlog ou no seguinte, mas depois de ter os veículos funcionando bem, adicionarei os pedestres. Uma coisa de cada vez.
Doações
Muito obrigado para todos que doaram, já juntamos algumas centenas de reais, isto nos deixa mais seguros em gastar em mais coisas pro jogo. Nos últimos meses gastamos centenas de reais com animações graças à vocês.
Prefira Pix: Qualquer valor; instantâneo; sem tarifas. Neste caso é somente Brasil.
Chave aleatória: c03b3c1e-414d-4aee-8cb9-902ce2c65334
Para outras opções internacionais, veja a página de doação/financiamento no site da 2nibble.
Eu recomendo fortemente que você leia a página de doação/financiamento para entender a importância de financiar a gente.
Não pode ajudar financeiramente? Simplesmente divulgue o nosso trabalho!