Итак: игра сверху вниз, мои враги преследуют игрока, когда они попадают на определенное расстояние, они останавливаются и стреляют. Если все они движутся в одном направлении, то все они оказываются в одном и том же месте (то есть стоят «внутри» друг друга), так как в настоящее время я не занимаюсь обнаружением столкновений между врагами - они могут свободно обгонять друг друга.
Какой простой способ обойти это? Или какая-то форма обнаружения столкновений или какая-то ai?
Ответы:
Вам не нужно обнаруживать столкновения, но вам нужно дать своим врагам немного интеллекта, и они не должны сталкиваться друг с другом. Обнаружение столкновений без этого в любом случае просто сделает ваших врагов глупыми - люди избегают друг друга, обычно они не сталкиваются.
Ищите «стекаются» некоторые простые поведения.
Основная идея состоит в том, что вещи должны идти к игроку, но не в непосредственной близости от препятствий (друг друга, стен, подобных вещей).
источник
Вы можете вдохновить себя на стекающиеся поведения , такие как Boids .
Как правило, они состоят из 3-4 очень простых правил, которые при правильном применении приводят к очень удовлетворительному и «сложному» поведению.
В вашем случае вы можете попробовать что-то вроде этого:
источник
В общем, вы спрашиваете о динамическом избегании между актерами. Вы можете взглянуть на скоростные препятствия: http://gamma.cs.unc.edu/RVO/
источник
Вы можете проверить совместную диффузию (большие анимации здесь) или какой - либо другой вид antiobject шаблона для движения. Хотя сам по себе алгоритм распространения может не помешать врагам пересекаться, вы можете добавить дополнительные ограничения, чтобы сделать его маловероятным или невозможным.
источник
Что делать, если вы не разрешаете перемещаться через другие подразделения? Мне кажется, вам это понадобится рано или поздно. Всякий раз, когда текущий путь заблокирован юнитом, отрегулируйте путь, чтобы перемещаться по нему.
источник
На сайте Крейга Рейнольда есть ссылки на поведение руля и флокирования . Они относительно просты в реализации, но могут вызывать приятное эмерджентное поведение.
источник
Все остальные ответы дают лучший результат, но самый дешевый (?) Способ избежать полной группировки - это просто добавить случайный вектор, который, возможно, составляет 25% от первоначального рассчитанного вектора движения, чтобы объекты немного отклонялись в общей группе больших двоичных объектов. , Это не будет мешать друг другу, но в зависимости от того, чего вы пытаетесь достичь, я обнаружил, что этого может быть достаточно. Объекты все еще могут группироваться с помощью этого метода, если вы обводите их кругами, но со временем они имеют тенденцию к диффузии.
Вот небольшая игра, которую я сделал несколько лет назад и которая демонстрирует этот метод: http://deleter.phatcode.net/index.php?page=projects&p=4
источник
Люди всегда поднимают boids, потому что это дает очень хорошие результаты, но внедрение boids может быть излишним для вашей конкретной цели. В прошлом я получал очень хорошие результаты, просто рандомизируя целевую позицию в маленьком круге.
Например, для построенного в Unity I демо I использовал свою команду Random.insideUnitSphere сделать стекаются пушистики
источник
Я столкнулся с той же проблемой, когда использовал NevMeshAgent в качестве врага, энмеиды проникают друг в друга, поэтому я увеличиваю
Радиус НавМешАгента
Благодаря игре DevAnswer
источник