Киберменты - разработка игры, неделя #4

Киберменты - разработка игры, неделя #4

Подошла к концу четвёртая неделя разработки, и вот, что было сделано за это время.

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

"Это база"

Простое перемещение по заданному пути. Без обнаружения столкновений

Любой неигровой персонаж должен уметь передвигаться из точки А в точку Б, это база. И хорошо, если НПС не будет ни с чем сталкиваться по пути, и вообще хорошо, если в 99% случаев будет добираться до нужной точки.

Для начала мы реализовали базовое перемещение простого коллайдера-машины по заданным точкам.

Побольше машин

Далее добавили к машинам уже существующую систему здоровья и урона, чтобы машины могли быть уничтожены.

Optimize me, if you can

Отдельной болью для данного проекта и камнем большущего преткновения стала оптимизация. И в особенности оптимизация НПС. Создание умных и высокопроизводительных НПС в играх - это искусство (которое потихоньку забывается, если судить по некоторым свежайшим тайтлам).

Кратко расскажем об основной проблеме:

  • Хочется иметь много НПС, потому что это приятнее для глаза, веселее играется, и погружение в мир более интенсивное
  • При всём при этом хочется иметь умных НПС, так как это тоже веселее играется и так далее
  • Два этих условия противоречат друг другу, так как процессор не резиновый, а умные нейросетки пока что очень тяжелы даже для одного бота, тем более для их большого количества
  • Что делать? Искать tradeoff - компромисс
  • Мало НПС и они умные - интересно, но пусто, скудно
  • Много НПС и они глупые - наполненно, живо, но неинтересно
  • Получается этакая задача об оптимизации аналогично спросу и предложению: где-то есть "та самая" точка равновесия

В связи с этой задачей, мы проводили много времени подбирая количество активных НПС и их разумность, при этом удерживая планку в заветные 16,666 мс за кадр (или 60 FPS).

У каждого свой путь

НПС, двигающиеся по заданному пути - это, конечно, прикольно. Можно определить маршрут, обойти все перпятствия, и бот никогда не застрянет.

Но что если что-нибудь встанет на пути? Самое очевидное - это игрок. Или же другой НПС. Как действовать в такой ситуации?

Здесь нужно искать свой путь. Динамический. И тут поможет старый добрый A* алгоритм. Данный алгоритм делит пространство на условные кубики. Каждый кубик он проверяет на наличие препятствий в нём. И незамысловатым алгоритмом строит путь между пустыми кубиками от точки А к точке Б.

Такая шняга достаточно требовательная к временным возможностям ЦПУ, поэтому возвращаемся к вопросу об оптимизации: нам пришлось подбирать "оптимальный вариант" (© OG).

Проблемы - это часть пути, это часть жизни

Ниже небольшая подборка багуль, с которым мы столкнулись при разработке НПС:

Состояние души

В классической теории ИИ, где нет речи о машинном обучении, LLM и подобном, есть понятие FSM или Машина Конечных Состояний. Именно этот банальный донельзя алгоритм мы и внедрили в наши НПС.

В двух словах, это алгоритм, который описывает "состояния души" НПС и условия переходов между этими состояниями. Например, состояние "чилл" и "страх": изначально НПС "чиллит", если выполняется условие для состояние страха (например, наличие врага рядом), то из состояния "чилл" НПС переходит в состояние "страх".

Исходя из текущего состояния мы уже можем что-то НПС указывать, например, если у тебя состояние "чилл", то ты просто стой на месте или лениво исследуй окресности. А если у тебя состояние "страх", то выбери далёкую от врага точку, врубай по газам и двигайся туда. Как приедешь - проверь, не рядом ли враг и если нет, то переходи опять в "чилл".

Прочее

Из прочего функционала добавили: прицепы, следующие за НПС, респавн НПС, если на карте их маловато стало; квестовые НПС, способные говорить субтитрами и следить за объектами.

Мы в соцсетях

1
1
2 комментария