Resumo

Temos trabalhado na lógica e na IA das unidades. Este post explica nossa abordagem para a IA usada na primeira passada da implementação da feature de Unidades.

IA das Unidades

Esta semana comecei a desenvolver a feature de unidades. Essa feature vai cuidar de todas as unidades do jogo.

Minha abordagem no momento é bem simples. O ritmo do jogo é lento o suficiente para eu deixar as unidades rodando completamente no server-side. Um atraso do RTT inteiro em uma conexão ruim, mesmo que chegue a 1s, não vai ser um problema para este jogo. Por causa disso, os jogadores vão apenas emitir comandos para as unidades, e toda a lógica das unidades vai rodar somente no servidor. Localmente, eu só preciso interpolar/extrapolar a posição da unidade.

A IA das unidades é implementada com bastante facilidade, então. Como tudo acontece no mesmo contexto, posso usar uma simples behavior tree (BT) para implementar tudo. O controlador de BT é desativado nos clientes e ativado no servidor.

Foi exatamente isso que fiz nesta iteração. Criei uma cena onde isolei a feature de entidades estáticas. Lá eu tenho um código que cria um mapa simples com um recurso, uma cidade e um extrator.

A unidade então é spawnada e preparada com sua configuração (que define quantos recursos ela pode carregar, neste caso). Depois disso, eu aciono o cérebro da unidade para rodar uma BT simples. A implementação atual apenas procura o extrator mais próximo, vai até ele (pathfinding) e extrai todos os recursos que consegue. Depois ela encontra um receptor de recursos, neste caso, uma cidade, e vai até ele para entregar os recursos. Essa não vai ser a IA final, já que neste jogo o jogador vai controlar para onde a unidade vai e o que ela vai fazer lá, mas é uma prova de conceito válida.

Decidi usar behavior trees porque elas são fáceis de entender e porque oferecem uma forma flexível de definir comportamento. Com BTs eu consigo criar rapidamente algumas ações e tarefas, combiná-las em subtrees reutilizáveis e, em questão de minutos, criar uma IA realmente complexa com blocos de construção pequenos e fáceis de entender.

No passado, eu tinha desenvolvido minha própria solução, em cima da biblioteca XNode. Nada difícil de desenvolver, mas o XNode impõe MUITAS restrições aos dados e os amarra à camada de apresentação. Isso é algo de que eu realmente não gosto, fazendo com que o código tenha alocações desnecessárias e limitações que ele não deveria ter. Depois de muita pesquisa, encontrei a biblioteca NodeCanvas. Muito fácil de usar, com ótima aparência, tem uma renderização rápida na sua janela, e o melhor: é uma API fácil de usar, limpa e realmente flexível. Escolhi essa por enquanto, vamos ver no que dá.

Galeria

1 imagem