Я использую поиск пути в своей игре, чтобы привести толпу к другому игроку (преследовать его). Это работает для того, чтобы превзойти игрока, но я хочу, чтобы они немного остановились перед назначением (поэтому выбор предпоследнего узла работает нормально).
Тем не менее, когда несколько мобов преследуют мобильные устройства, они иногда «укладываются друг на друга». Какой лучший способ избежать этого? Я не хочу относиться к мобам как к непрозрачным и заблокированным (потому что это не так, вы можете проходить через них), но я хочу, чтобы у мобов было какое-то чувство структуры.
Пример:
Представь, что каждая змея ведет себя ко мне и должна окружать «Сецуна». Заметьте, как обе змеи выбрали меня? Это не строгое требование; даже немного смещено - это нормально. Но они должны «окружить» Сецуну.
источник
Ответы:
Дайте вашим агентам слабый «электростатический заряд», чтобы заставить их отталкивать друг друга, в соответствии с законами Кулона .
Предполагая для простоты, что мобы должны отталкивать друг друга с эквивалентной силой, этого должно быть достаточно, чтобы приложить силу между каждой парой мобов с величиной
some_constant / distance^2
, гдеsome_constant
есть настраиваемая сила отталкивания иdistance
расстояние, разделяющее их.Сила отталкивания затем уменьшается с квадратом расстояния.
Природа кода есть отличный пример (с живой демонстрацией) здесь . Это выглядит так:
Сопоставление каждого элемента со всеми другими - это
O(n^2)
операция квадратичного времени ( ). Если у вас действительно много агентов, вы можете оптимизировать вычисления сил с помощью приближения Барнса-Хата , которое сводится к логарифмическому (O(n log n)
), но требует квадродерева .источник
Мой подход похож на @ Anko's, но основан на работе Миллингтона и Фанге из « Искусственного интеллекта для игр». .
Вот как должно выглядеть поведение Разделения, но вы должны принять во внимание, что эта скорость должна вычисляться со скоростью агента в его функции Обновления.
источник