Есть ли простой способ остановить врагов, стоящих в одном месте?

24

Итак: игра сверху вниз, мои враги преследуют игрока, когда они попадают на определенное расстояние, они останавливаются и стреляют. Если все они движутся в одном направлении, то все они оказываются в одном и том же месте (то есть стоят «внутри» друг друга), так как в настоящее время я не занимаюсь обнаружением столкновений между врагами - они могут свободно обгонять друг друга.

Какой простой способ обойти это? Или какая-то форма обнаружения столкновений или какая-то ai?

Iain
источник
1
Ограничьте себя одним врагом. : P
Kylotan

Ответы:

18

Вам не нужно обнаруживать столкновения, но вам нужно дать своим врагам немного интеллекта, и они не должны сталкиваться друг с другом. Обнаружение столкновений без этого в любом случае просто сделает ваших врагов глупыми - люди избегают друг друга, обычно они не сталкиваются.

Ищите «стекаются» некоторые простые поведения.

Основная идея состоит в том, что вещи должны идти к игроку, но не в непосредственной близости от препятствий (друг друга, стен, подобных вещей).

JasonD
источник
6
Это также называется boids. Прочитайте о простых правилах, связанных с boids, здесь: en.wikipedia.org/wiki/Boids Должно быть тривиально, чтобы реализовать эти ограничения.
Nailer
12

Вы можете вдохновить себя на стекающиеся поведения , такие как Boids .

Как правило, они состоят из 3-4 очень простых правил, которые при правильном применении приводят к очень удовлетворительному и «сложному» поведению.

В вашем случае вы можете попробовать что-то вроде этого:

  • Разделение (минимальные радиусы между врагами)
  • Сплоченность (поэтому они путешествуют группами)
  • Выравнивание (поэтому они имеют тенденцию двигаться в одном направлении)
  • Целевые (они должны стремиться двигаться к игроку)
egarcia
источник
Это почти дословная копия ответа Джейсона Д. Клянусь, я не смотрел на это перед публикацией.
egarcia
4

В общем, вы спрашиваете о динамическом избегании между актерами. Вы можете взглянуть на скоростные препятствия: http://gamma.cs.unc.edu/RVO/

slicedlime
источник
3

Вы можете проверить совместную диффузию (большие анимации здесь) или какой - либо другой вид antiobject шаблона для движения. Хотя сам по себе алгоритм распространения может не помешать врагам пересекаться, вы можете добавить дополнительные ограничения, чтобы сделать его маловероятным или невозможным.

Leander
источник
Полное раскрытие: я уверен, что нашел где-то здесь ссылку на совместную рассылку, но я не могу найти пост, который ссылается на него сейчас. Это была настоящая находка. =)
Леандер
Это супер, но я немного сложнее, чем мне нужно. Все равно прочтет технический документ, но сумел реализовать более простое решение.
Иан
2

Что делать, если вы не разрешаете перемещаться через другие подразделения? Мне кажется, вам это понадобится рано или поздно. Всякий раз, когда текущий путь заблокирован юнитом, отрегулируйте путь, чтобы перемещаться по нему.

jmp97
источник
2

На сайте Крейга Рейнольда есть ссылки на поведение руля и флокирования . Они относительно просты в реализации, но могут вызывать приятное эмерджентное поведение.

tenpn
источник
По сути, это тот же ответ, что и у других 2, но +1 для ссылки - этот веб-сайт - действительно хорошая ссылка.
AShelly
1

Все остальные ответы дают лучший результат, но самый дешевый (?) Способ избежать полной группировки - это просто добавить случайный вектор, который, возможно, составляет 25% от первоначального рассчитанного вектора движения, чтобы объекты немного отклонялись в общей группе больших двоичных объектов. , Это не будет мешать друг другу, но в зависимости от того, чего вы пытаетесь достичь, я обнаружил, что этого может быть достаточно. Объекты все еще могут группироваться с помощью этого метода, если вы обводите их кругами, но со временем они имеют тенденцию к диффузии.

Вот небольшая игра, которую я сделал несколько лет назад и которая демонстрирует этот метод: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
источник
1

Люди всегда поднимают boids, потому что это дает очень хорошие результаты, но внедрение boids может быть излишним для вашей конкретной цели. В прошлом я получал очень хорошие результаты, просто рандомизируя целевую позицию в маленьком круге.

Например, для построенного в Unity I демо I использовал свою команду Random.insideUnitSphere сделать стекаются пушистики

jhocking
источник
+1 Я согласен, еще один пример этой стратегии (возможно, с чуть лучшей гарантией не перекрытия) можно найти здесь: единицы «Unclutter» в игре RTS
MichaelHouse