Предотвращение укладки объектов поверх друг друга в верхнем шутере - PullRequest
4 голосов
/ 01 сентября 2011

Я работаю над верхним стрелком, и со временем, когда я буду двигаться по кругу вокруг арены, враги начнут складываться друг на друга, пока они не станут одним гигантским стеком юнитов.В конечном итоге это выглядит довольно глупо.

ИИ довольно прост и прост: найдите игрока, подойдите к нему и атакуйте его, если он в пределах досягаемости.

Какой лучший способ подтолкнуть ихдруг от друга, чтобы все они не оказались на одном месте?Я думаю, что флокирование - это немного излишне (и, вероятно, слишком интенсивно, поскольку на экране одновременно будет 100-200 врагов).

Идеи?

Спасибо!

1 Ответ

9 голосов
/ 01 сентября 2011

Вот несколько разных подходов к решению этой проблемы:

  1. Вы можете определить потенциальное поле для каждой единицы, которая связывает "высоту" или "плохость" с каждым местоположением на карте. Каждое подразделение движется таким образом, что пытается минимизировать свой потенциал, возможно, делая шаг в направлении, которое перемещает его к наименьшему потенциалу, который он может сделать за один шаг. Вы можете определить потенциальную функцию так, чтобы она наклонялась к игроку, заставляя все юниты пытаться переместиться к игроку, но при этом быть очень высокой вокруг существующих юнитов, заставляя юниты избегать столкновения друг с другом. Это очень мощный фреймворк, который постоянно используется в AI; Одним из известных примеров является его использование в Berkeley Overmind AI для StarCraft, которое в итоге выиграло соревнование AI StarCraft. Если вы примените такой подход, вы, возможно, сможете затем настроить потенциальную функцию, чтобы заставить ИИ вести себя многими другими интересными способами, и могли бы легко поддерживать флокирование. Я лично считаю, что это лучший подход, поскольку он наиболее гибкий. Это также было бы отличной отправной точкой для более продвинутых моделей поиска пути. Для очень хорошего и практического введения в потенциальные поля для ИИ, посетите этот веб-сайт . Для подробного математического введения в потенциальные поля и их применения вы можете проверить эту статью , в которой рассматриваются различные методы ИИ с использованием потенциальных полей.

  2. Если вы определяете ограничивающий круг для каждого врага, вы можете просто явно запретить юнитам складываться друг на друга, не позволяя любым двум юнитам находиться на расстоянии двух радиусов друг от друга. Каждый раз, когда два юнита подходили слишком близко, вы могли либо остановить движение одного из них, либо заставить их оказывать друг на друга силы, чтобы разнести их друг от друга. Когда две единицы сталкиваются друг с другом, вы можете просто выбрать случайный вектор силы, чтобы применить к каждой единице, чтобы попытаться раздвинуть их. Это гораздо более хакерское и менее элегантное решение, чем потенциальные поля, но если вам нужно что-то запустить и запустить, это определенно приемлемый вариант.

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

Надеюсь, это поможет!

...