Как справиться с поиском и перемещением сущностей в большом сетевом мире?

12

введите описание изображения здесьРассматривая изображение выше с плитками, разделенными на блоки 32х32, у меня есть сущность, которая помечена для «агрессивных» близлежащих игроков, приближающихся к ней. Я бы хотел, чтобы этот монстр идеально преследовал игрока (и продолжал преследовать игрока некоторое время). В настоящее время мое единственное движение выполняется через простой интерполятор для удаленных объектов, и это работает, потому что промежутки между обновлениями перемещения довольно малы.

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

Благодарность!

Вон Хилтс
источник

Ответы:

9

Для простого начала вы можете реализовать рулевое поведение . Специально искать поведение . введите описание изображения здесь

В дополнение к поиску персонажей следует избегать препятствий .

введите описание изображения здесь

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

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

Рулевое управление также позволит вам определить максимальные скорости поворота и максимальные скорости для врагов.

Управлять рулевым управлением на клиенте можно с помощью периодических обновлений с сервера, чтобы обеспечить их постоянную работу.

MichaelHouse
источник
Будет ли это означать имитацию поведения рулевого управления на сервере или я могу логически «привязать» сущность по пути? Мне не нужна огромная точность.
Вон Хилтс
Только рулевое управление должно быть смоделировано (хотя оно не очень тяжелое). Тем не менее, направление к путевым точкам может быть обновлено без моделирования. Просто убедитесь, что клиент находится в пределах досягаемости «текущей» путевой точки, и направьте ее к правильной путевой точке в качестве своей «следующей». Это может привести к некоторой привязке, если сущность будет не в курсе и внезапно обновлена.
MichaelHouse
+1 за отличный ответ. Спасибо за сохранение моих нескольких часов.
Г-н Махбубур Рахман
1

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

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

но что еще более важно это не выглядит реалистичным и может обрезать стены! Я не хочу имитировать все движение на сервере, если этого можно избежать ...

Вам необходимо смоделировать движение на сервере. Как еще вы узнаете, что все игроки видят одинаковое поведение?

Вам понадобится базовый поиск пути. A * является стандартом. Вы можете рассчитать путь к цели, а затем следование этому пути - просто случай установки векторов движения, как описано выше. (Или вы можете использовать поведение руля, как в ответе Byte56, что по сути то же самое с некоторыми добавленными дополнениями.)

Kylotan
источник