Nessas últimas semanas fiz algumas revoluções no meu código, muita coisa foi descartada, outras adicionadas e algumas foram apenas refeitas. Uma das novidades foi dar status aos heróis, com fome, sono, diversão, sujeira e medo. Para implementar cada um desses status utilizei exatamente o método deste blog (Sério, vão ver esse blog quando tiverem um tempinho que ele responde duas perguntas que todo programador já fez sobre The Sims e Spore). É bem simples de implementar e combina bem com o que estava pensando sobre os status e resolve a implementação da tomada de decisão "Qual ação um herói deveria fazer?". Já que pra isso é só verificar a que tem maior impacto positivo na soma final dos status.
Junto com essa implementação dos status veio uma grande alteração, originalmente planejava utilizar máquinas de estado pra definir qual seria a próxima ação assim como a sequência de ações. O problema que essa máquina de estados cresce muito rapidamente, dificultando a manutenção e pequenas alterações, assim como tem obriga a verificar a todo instante se a ação é válida. Para solucionar esse problema emprestei outra solução utilizada em The Sims: Smart Objects. A arquitetura de Smart Objects coloca toda a inteligência nos objectos e deixa os agentes "burros". A idéia é que toda a sequência de ações seja conhecida pelo objeto e o agente só execute as animações corretas. Nestes links [1], [2] e [3] temos os principais sites que utilizei de referência para a implementação. Mas o melhor é este aqui que contém o código feito pelo mestre Will Wright, está em C e isso pode ser uma barreira para quem não conhece a linguagem, mas vale a pena dar uma lida, nem que seja por cima. Outra referência legal que encontrei pelo caminho é essa palestra da GDC que detalha como são feitas ações concorrentes no The Sims 4.
Essa palestra é muito legal e mostra como essa área de IA ainda não
está totalmente "resolvida" e tem ainda muita coisa que pode ser feito,
pesquisado ou ainda criado.
Mudando totalmente de assunto, estou tendo alguns problemas com o desempenho do jogo. Em uma rápida busca dentro do código, utilizando o profiler da Unity, descobri que o problema está sendo o path finding. Usar Smart Objects melhorou bastante o desempenho, mas vou ter que voltar para estudar algoritmos de path finding. Espero cobrir um novo algoritmo de path finding nas próximas postagens.
0 comentários:
Postar um comentário