Eu tenho um jogo 2D de cima para baixo, onde a IA aparece nas bordas do mapa e corre em direção ao centro.
Estou usando A * e uma malha de nó para fazer o pathfinding.
No momento, a IA aparece em um ponto na borda do mapa e todos seguem o mesmo caminho, que é o caminho mais curto para o centro.
Agora, quero que sejam mais surpreendentes e interessantes e tomem caminhos diferentes entre si.
Posso pensar imediatamente em duas idéias para fazer isso, mas queria saber se existem outras maneiras ou melhores que as pessoas costumam usar?
Quando um inimigo aparecer e gerar um caminho para o centro, aumente temporariamente o custo de todos os nós nesse caminho e depois diminua-os lentamente ao longo do tempo. Então a IA inimiga que aparecer mais tarde será forçada a seguir um caminho mais amplo.
A abordagem acima levará a IA a seguir um caminho cada vez mais amplo e ainda assim ser muito previsível. Por isso, pensei em introduzir também vários nós de objetivos intermediários no mapa. Quando a IA aparece, eles escolhem aleatoriamente um dos objetivos intermediários e dirigem-se para lá primeiro antes de irem para o centro do mapa. Combinar isso com a abordagem acima de aumentar os custos pode parecer muito bom?
Quais abordagens as pessoas acharam que funcionam melhor para fazer com que a IA varie os caminhos que elas seguem, parecem convincentes e surpreendentes?
fonte
Como primeira idéia, tente adicionar um pequeno valor aleatório ao peso de cada nó ao encontrar o caminho. Dessa forma, todo agente procurará um caminho em um ambiente ligeiramente diferente. Não tenho certeza se isso funcionará no seu caso, mas deve ser muito fácil tentar.
fonte
Eu gosto da resposta de Nevermind , no entanto, dada a limitação descrita nos comentários, é isso que eu tentaria:
(distanceToGoal) + Max(0, desiredDistance - distanceTravelled))
.Isso faria com que as unidades tentassem ir além, o que provavelmente é um caminho diferente, o que resultaria em possíveis caminhos diferentes.
Você também pode adicioná-lo ao seu huerestic inicial para cada unidade, mas o intervalo aleatório provavelmente teria que ser um pouco maior.
fonte
Como apontado por Nick Wiggill, a abordagem mais simples seria fazer um círculo em torno do objetivo.
A parte importante é eliminar todos os caminhos do círculo para o waypoint original, pois você provavelmente terminaria com inimigos cruzando o círculo para chegar ao waypoint inicial.
Com isso, você pode obter qualquer variante jogando com vários valores, adicionando waypoints secundários no círculo próximo ao inicial etc.
fonte
Seu problema aqui é essencialmente que A * é um algoritmo para encontrar a rota mais rápida para um destino. Se esse é seu critério principal para um caminho "bom", não surpreende que todos os seus atores tomem as mesmas decisões.
O que você precisa fazer é modificar seus critérios de qualidade para o caminho, para que 'o menor seja o melhor' não seja o único fator. O elemento aleatoriedade é fundamental nisso, mas não tanto que diminua a inteligência de encontrar caminhos (ou seja, os atores tomam caminhos estupidamente redondos para o alvo).
A busca de caminhos é ingênua por natureza, pois geralmente supõe que o ator tenha conhecimento perfeito de toda a rota antes de começar. Isso sempre vai parecer irreal. A solução sugeriu que objetivos intermediários escolhidos estão a um passo disso - a IA está tentando se aproximar do alvo, mas apenas tenta navegar em pequenas seções por vez (isso é análogo à vida real, onde você só pode navegar até o ponto mais distante). como você pode ver e ao percorrer mais o caminho, pode ver mais adiante).
Eu talvez recomendo uma maneira mais simples de ver isso. Quando estiver procurando o caminho, não basta manter um único melhor caminho que encontrei até agora. Em vez disso, colete um conjunto dos melhores 5 ou 10 caminhos. Use um limite para descartar valores discrepantes óbvios. Por exemplo, se o melhor caminho percorre 20u para chegar ao alvo, o próximo melhor percorre 21u, e o próximo depois percorre 50u. Defina um limite 20% maior que o melhor caminho e descarte o caminho de 50u porque é estupidamente mais longo. Agora você tem vários caminhos para escolher e, ao selecionar aleatoriamente esse conjunto de caminhos, seus atores tomarão decisões diferentes.
No entanto, você não obterá esse tipo de informação com a pesquisa padrão A *, então acho que você precisaria modificar o algoritmo ou usar outra coisa para reunir o conjunto de caminhos possíveis.
fonte
Se você tiver um pequeno conjunto de inimigos recorrentes (ou tipos de inimigos), tente dar a eles personalidades que afetam seus movimentos. Eles não precisam ser grandes, apenas coisas que surgem de vez em quando. Um bom exemplo disso são os fantasmas do Pac-Man. Divida seu A * em vários objetivos intermediários. Talvez um inimigo seja realmente estúpido e se perca facilmente, indo em uma direção aleatória a cada terceiro nó (que não seja diretamente para trás). Seja criativo.
fonte