Например ради:
- Допустим, в мире 10 комнат.
- И скажем, мир населен 10 сущностями.
- И у каждой сущности есть своя «ежедневная рутина», в которой она выполняет определенные действия в комнате, а также может перемещаться между комнатами.
Учитывая, что игрок может находиться только в одной комнате одновременно, каков хороший способ отслеживать действия, которые другие объекты выполняют в других комнатах за кадром?
- Самый простой вариант - проверить каждую из 10 сущностей в каждом кадре, проверить их положение / состояние и определить, должен ли объект находиться в комнате, где находится игрок, в любой момент времени. (Это, однако, кажется очень ресурсоемким, особенно когда количество комнат / сущностей увеличивается.)
Другим вариантом является отслеживание времени, прошедшего с начала игры, затем каждая из сущностей проверяет, пересекается ли ее шаблон с комнатой, в которой находится игрок, и проверяет время относительно того, Предполагается, что объект находится в той же комнате в это конкретное время, объекты, паттерны которых не пересекаются с текущей комнатой, в которой находится игрок, ничего не делают, пока игрок не войдет в комнату, в которой пересекается их паттерн, и только в этой точке рассчитывают, будет ли они должны оказать. (Но если они взаимодействуют с комнатой, им придется всегда проверять состояние комнат, которые пересекают их маршрут, чтобы определить их местоположение в тот момент времени, что не так уж и хорошо.)
Третий вариант, к которому я пришел, - это, во-первых, только смотреть на маршруты, которые пересекают местоположение игрока (как описано ранее), во-вторых, при входе в комнату, проверять, находится ли игрок в этой комнате, если нет, то проверять только состояние комнаты и сколько времени потребуется, чтобы перейти в следующую комнату. Например, NPC-уборщик входит в комнату, проверяет состояние комнаты, видит, что игрок сделал утечку, рассчитывает, сколько времени потребуется, чтобы очистить его, сколько времени займет путь и т.д. Время для входа в следующую комнату, мы только проверяем, находится ли игрок в комнате. Точное местоположение NPC для целей рендеринга будет рассчитываться только тогда, когда игрок войдет в комнату.
После некоторого мозгового штурма я пришел к третьему варианту, но мне было интересно, существует ли, возможно, известный или лучший способ справиться с такими вещами?
источник
Ответы:
Очень простой подход - использовать «Уровень детализации AI». Грубо говоря, это означает, что вы обновляете AI чаще, чем ближе к плееру / камере. Вы также можете уменьшить сложность вычислений ИИ, которые находятся дальше, особенно. для поиска пути. В конце концов, если игрок не может видеть персонажа хорошо или вообще, нет смысла тратить кучу усилий на симуляцию персонажа с максимальной точностью.
В вашем примере комната, в которой находится игрок, может получить наивысшую точность (ИИ обновляет каждый кадр в полном разрешении). Соседние комнаты могут получить следующую наивысшую точность (обновление каждые 10 тиков, удаление сглаживания пути и анимации). Все остальные комнаты могут получить самую низкую точность (обновление каждую секунду, поиск пути с низким разрешением, устранение ненужных взаимодействий NPC-NPC).
Большие и более сложные игры могут (и имеют) использовать подобные подходы. Они могут упростить боевые расчеты, телепортировать персонажей, а не находить пути, когда им нужно двигаться, и т. Д.
Если ваша игра достаточно велика, и вы не можете все время хранить ее в памяти, тогда хорошим решением будет сохранить время последнего обновления в сохраненных данных комнаты и воспроизвести его симуляцию за экраном (с самым низким разрешением), когда он загружен обратно.
Если вы ожидаете, что ИИ будет перемещаться в «живые» области из не загруженных «спящих» областей по расписанию, вы либо захотите создать данные со сверхнизкой точностью, чтобы эти области всегда оставались в памяти (например, только самые грубые). указывайте уровень детализации и расположение ключевых объектов / персонажей), или вы захотите периодически циклически переключать эти области (например, сохранять «спящие» области в памяти и моделировать на низкой точности с редкими обновлениями, а затем циклически перебирать их через все « "спящие" области, в которых есть ключевые активные NPC, области выгрузки и загрузки, как вы это делаете).
источник
Я бы сохранил сущности, которые в данный момент находятся в комнате, в экземпляре этой комнаты, объект комнаты также будет отслеживать, когда какие сущности необходимо обновить (например, перейти в другую комнату или изменить что-то в этой комнате и т. Д.). И я бы также обновлял одну (или более) комнату каждую секунду (может быть, в другой теме).
Когда вы обновляете комнату, позиции NPC должны быть обновлены, и все действия, которые они выполнили, которые взаимодействуют с комнатой с момента последнего обновления, должны быть обработаны, и, наконец, время следующего необходимого обновления должно быть проверено / обновлено.
Если сущность перемещается из одной комнаты в другую, ее экземпляр должен храниться в другой комнате, а также должно обновляться следующее обновление сущности .
Таким образом, вам нужно только обновлять текущую комнату и комнаты, в которых запланировано обновление на тот момент времени, обновление других комнат просто необязательно (но рекомендуется, если у вас есть ИИ, который обновляется всякий раз, когда игрок двигается или что-то делает) ,
источник