Então: jogo de cima para baixo, meus inimigos perseguem o jogador, quando ficam a uma certa distância, ficam parados e disparam. Se todos estão vindo da mesma direção, todos acabam no mesmo local (ou seja, "dentro" um do outro), pois atualmente não estou detectando colisões entre inimigos - eles são livres para passar um pelo outro.
O que é uma maneira simples de contornar isso? Alguma forma de detecção de colisão ou alguma ai?
ai
collision-detection
Iain
fonte
fonte
Respostas:
Você não precisa de detecção de colisão, mas precisará dar aos seus inimigos um pouco de inteligência e evitar que eles se encontrem. A detecção de colisões sem isso fará com que seus inimigos pareçam estúpidos de qualquer maneira - as pessoas se evitam, geralmente não colidem.
Procure "reunir" alguns comportamentos simples.
A idéia básica é que as coisas devem ir em direção ao jogador, mas longe de um obstáculo próximo (um ao outro, paredes, esse tipo de coisa).
fonte
Você pode se inspirar em comportamentos de flocagem , como o Boids .
Elas tendem a consistir em 3-4 regras muito simples que, aplicadas corretamente, resultam em comportamentos muito satisfatórios e de aparência complexa.
No seu caso, você pode tentar algo como isto:
fonte
O que você está perguntando em geral é a evitação dinâmica entre os atores. Você pode dar uma olhada nos obstáculos de velocidade: http://gamma.cs.unc.edu/RVO/
fonte
Você pode conferir a difusão colaborativa (ótimas animações aqui) ou algum outro tipo de padrão antiobjeto para movimento. Embora o algoritmo de difusão por si só não impeça a passagem de inimigos, você pode adicionar restrições adicionais para torná-lo improvável ou impossível.
fonte
E se você não permitir a movimentação por outras unidades? Parece-me que você vai precisar mais cedo ou mais tarde. Sempre que o caminho atual estiver bloqueado por uma unidade, ajuste o caminho para se movimentar.
fonte
Há alguma referência para comportamentos de direção e flocagem no site de Craig Reynold . Eles são relativamente simples de implementar, mas podem produzir um adorável comportamento emergente.
fonte
Todas as outras respostas produzem um resultado melhor, mas a maneira mais barata (?) De evitar o agrupamento completo é adicionar apenas um vetor aleatório que seja talvez 25% do vetor de movimento calculado original, para que os objetos se movimentem um pouco em um grupo de blobs geral . Isso não manterá as coisas completamente distantes umas das outras, mas, dependendo do que você está tentando alcançar, descobri que isso pode ser adequado. Os objetos ainda podem agrupar-se com esse método se você executar círculos em torno deles, mas com o tempo eles tendem a se difundir.
Aqui está um pequeno jogo que eu criei há vários anos que demonstra esse método: http://deleter.phatcode.net/index.php?page=projects&p=4
fonte
As pessoas sempre criam boids porque isso fornece resultados muito bons, mas a implementação de boids pode ser um exagero para seu objetivo específico. No passado, obtive resultados muito bons, simplesmente aleatorizando a posição do alvo em um pequeno círculo.
Por exemplo, para uma demonstração que construí no Unity, usei o comando Random.insideUnitSphere para fazer puffballs
fonte
Eu estava enfrentando o mesmo problema ao usar o NevMeshAgent como inimigo, os enemeis estão penetrando um no outro, então eu aumento o
Raio de NavMeshAgent
Graças ao gameDevAnswer
fonte