Киберменты - разработка игры, неделя #4
Подошла к концу четвёртая неделя разработки, и вот, что было сделано за это время.
На текущую неделю была запланирован старт работы над НПС. Боты в игре - это чуть ли не основа геймплея, поэтому на реализацию даже первых их набросков было выделено две недели.
"Это база"
Любой неигровой персонаж должен уметь передвигаться из точки А в точку Б, это база. И хорошо, если НПС не будет ни с чем сталкиваться по пути, и вообще хорошо, если в 99% случаев будет добираться до нужной точки.
Для начала мы реализовали базовое перемещение простого коллайдера-машины по заданным точкам.
Далее добавили к машинам уже существующую систему здоровья и урона, чтобы машины могли быть уничтожены.
Optimize me, if you can
Отдельной болью для данного проекта и камнем большущего преткновения стала оптимизация. И в особенности оптимизация НПС. Создание умных и высокопроизводительных НПС в играх - это искусство (которое потихоньку забывается, если судить по некоторым свежайшим тайтлам).
Кратко расскажем об основной проблеме:
- Хочется иметь много НПС, потому что это приятнее для глаза, веселее играется, и погружение в мир более интенсивное
- При всём при этом хочется иметь умных НПС, так как это тоже веселее играется и так далее
- Два этих условия противоречат друг другу, так как процессор не резиновый, а умные нейросетки пока что очень тяжелы даже для одного бота, тем более для их большого количества
- Что делать? Искать tradeoff - компромисс
- Мало НПС и они умные - интересно, но пусто, скудно
- Много НПС и они глупые - наполненно, живо, но неинтересно
- Получается этакая задача об оптимизации аналогично спросу и предложению: где-то есть "та самая" точка равновесия
В связи с этой задачей, мы проводили много времени подбирая количество активных НПС и их разумность, при этом удерживая планку в заветные 16,666 мс за кадр (или 60 FPS).
У каждого свой путь
НПС, двигающиеся по заданному пути - это, конечно, прикольно. Можно определить маршрут, обойти все перпятствия, и бот никогда не застрянет.
Но что если что-нибудь встанет на пути? Самое очевидное - это игрок. Или же другой НПС. Как действовать в такой ситуации?
Здесь нужно искать свой путь. Динамический. И тут поможет старый добрый A* алгоритм. Данный алгоритм делит пространство на условные кубики. Каждый кубик он проверяет на наличие препятствий в нём. И незамысловатым алгоритмом строит путь между пустыми кубиками от точки А к точке Б.
Такая шняга достаточно требовательная к временным возможностям ЦПУ, поэтому возвращаемся к вопросу об оптимизации: нам пришлось подбирать "оптимальный вариант" (© OG).
Проблемы - это часть пути, это часть жизни
Ниже небольшая подборка багуль, с которым мы столкнулись при разработке НПС:
Состояние души
В классической теории ИИ, где нет речи о машинном обучении, LLM и подобном, есть понятие FSM или Машина Конечных Состояний. Именно этот банальный донельзя алгоритм мы и внедрили в наши НПС.
В двух словах, это алгоритм, который описывает "состояния души" НПС и условия переходов между этими состояниями. Например, состояние "чилл" и "страх": изначально НПС "чиллит", если выполняется условие для состояние страха (например, наличие врага рядом), то из состояния "чилл" НПС переходит в состояние "страх".
Исходя из текущего состояния мы уже можем что-то НПС указывать, например, если у тебя состояние "чилл", то ты просто стой на месте или лениво исследуй окресности. А если у тебя состояние "страх", то выбери далёкую от врага точку, врубай по газам и двигайся туда. Как приедешь - проверь, не рядом ли враг и если нет, то переходи опять в "чилл".
Прочее
Из прочего функционала добавили: прицепы, следующие за НПС, респавн НПС, если на карте их маловато стало; квестовые НПС, способные говорить субтитрами и следить за объектами.