Откуда берутся баги в Cyberpunk 2077: летающие машины, NPC в T-позах и другие
Последний крупный патч исправил не все проблемы нашумевшей RPG.
Скриншот: игра Cyberpunk 2077 / CD Projekt RED
При всех своих неоспоримых достоинствах Cyberpunk 2077 также запомнится печально известным релизом: многие игроки на старте в 2020 году регулярно сталкивались с серьёзными багами, которые ломали погружение и не позволяли пройти игру до конца. Студия CD Projekt RED потратила много времени на исправление технических проблем Cyberpunk 2077, но даже после выхода обновления 2.0 и дополнения Phantom Liberty в 2023 году игроки по-прежнему натыкаются на летающие в воздухе предметы и становятся свидетелями непредсказуемого поведения NPC.
В этой статье редакция «Геймдев» Skillbox Media разбирается, какие баги можно встретить в Cyberpunk 2077 и почему они становятся возможными.
Мы не можем знать всех особенностей движка REDengine 4, который CD Projekt RED использовала для создания Cyberpunk 2077. А значит, и определить точную причину некоторых багов тоже нельзя — это могут знать только программисты студии. Зато мы можем выдвинуть предположения на основе общепринятых принципов геймдева.
Подписывайтесь на наш телеграм-канал «Чекпоинт». Это уютное место, в котором мы рассказываем об играх и о том, как они создаются, а также делимся полезными советами разработчиков и пишем о важных обновлениях популярного софта. Комментарии открыты: вы можете предложить идею для нового текста или просто обсудить всё, что связано с геймдевом.
Предметы не на своих местах
Время от времени игроки по-прежнему сталкиваются с ситуацией, когда вокруг персонажей летают предметы. Чаще всего это оружие, которое закреплено за тем или иным NPC.
Предметы, которые главный герой или другие персонажи держат в руках, — это отдельные объекты, которые, как правило, прикреплены к модели персонажа при помощи специальных якорных точек. Это позволяет разработчикам анимировать руку персонажа, не боясь, что оружие или какой-нибудь другой объект уедут в сторону.
В сцене из видео выше якорная точка по какой-то причине сместилась по отношению к своему исходному положению. На это указывает то, что пистолет продолжает следовать за рукой Джеки. Почему так произошло, сказать сложно. Возможно, смещение якорной точки было необходимо для конкретной кат-сцены, после которой эта точка по каким-то причинам не вернулась на место.
Агрессивный автопилот
Другой классический баг, который встречается с релиза, — агрессивный автопилот машин. Когда игрок вызывает своё авто через специальное меню, оно должно появиться недалеко от персонажа, вне поля его зрения, и затем подъехать к нему. Иногда, впрочем, это идёт не по плану: машина может застрять по пути, врезаться в препятствие или, наоборот, проигнорировать его.
Такое странное поведение указывает сразу на несколько возможных проблем. В первую очередь — на неряшливую работу с навигационным мешем. Мы уже рассказывали об этом инструменте в статьях про баги в Starfield и искусственный интеллект в The Last of Us — не забудьте сохранить их куда-нибудь, чтобы почитать позже и узнать больше о навигационных мешах. Но если коротко, то навмеши заменяют искусственному интеллекту зрение, поэтому любые ошибки в них неизбежно приводят к проблемам с навигацией.
В больших играх вроде Cyberpunk 2077 навмеши часто создаются автоматически. Это, скорее всего, и привело к проблемам. На меше могли не отметиться дорожные знаки и барьеры. Также возможно, что левел-дизайнеры начали добавлять препятствия в игровой мир уже после построения навигационной сетки. В результате машина попросту «не замечает» объекты на своём пути.
Другая возможная причина подобных багов — недочёты в просчёте пути. Чтобы NPC и объекты вроде автомобилей в играх вели себя правдоподобно, их перемещение должно быть естественным. Как правило, недостаточно просто построить кратчайший путь от точки А к точке Б. В этом случае машина будет давить прохожих и сбивать всё на своём пути. Но и запрещать совершать такие манёвры тоже нельзя: они могут быть полезны в погонях.
Решить такую задачу разработчики могут множеством способов. Например, можно назначить цену определённым действиям. Допустим, проезд по тротуару может быть дорогим для машины, и оправдать его может только что-то очень важное — например, выстрел в водителя. Другой вариант: разделить навмеш на разные категории. Можно сделать универсальные участки и те, которые используются только в отдельных случаях. При таком проектировании навигационного меша поведение NPC и машин можно легко контролировать при помощи одной бинарной переменной. Когда персонажу или объекту нужно проложить маршрут куда-либо, они разово проверяют, можно ли использовать всю карту или только часть.
В Cyberpunk 2077 что-то из этого работает не совсем так, как должно. Возможно, машинам, которые паркуются рядом с персонажем игрока, всегда доступен весь навмеш, чтобы они могли добираться до своего владельца быстрее.
Взорванные машины
После обновления 2.0 игроки стали регулярно замечать опалённые машины, которые катаются по городу как ни в чём не бывало.
В данном случае движок выбирает неправильную модель для авто. В обычной ситуации, когда «шкала здоровья» транспорта опускается до нуля, запускается цепочка событий: взрыв, отключение физики перемещения и возможности сесть в авто. В итоге вместе со взрывом обычный меш машины незаметно подменяется взорванным. Однако в некоторых случаях по какой-то причине замена происходит в обход остальной логики. Возможно, на этапе появления объекта в мире на авто накладывается неверная модель. Либо же какие-то внешние действия вроде коллизии с другим объектом заменяют меш. Баг настолько специфический, что без доступа к исходному коду назвать его причину наверняка не получится.
Похожие проблемы случаются и с противниками. Некоторые из них продолжают гулять по миру, даже если отрубить им голову. Примечательно, что похожую проблему мы уже описывали в статье про баги в Starfield.
В обоих случаях проблема, вероятно, связана с неправильным просчётом логики смерти. В идеале, после того как переменная, ответственная за здоровье, опускается до нуля, у NPC последовательно отключается возможность двигаться, активируется ragdoll-физика мёртвого тела, а игрок получает возможность обыскать персонажа. По какой-то причине вся эта логика осталась нетронутой. Возможно, здоровье противника, несмотря на отсутствие головы, не упало до нуля.
Впрочем, причина бага может быть и более экзотичной. Возможно, спавнер после окончания боя решил возродить противника на прежнем месте и взял из ограниченного пула персонажей того, которого только что убили. В результате на локации появился обычный персонаж со свежим набором переменных, но с изуродованным мешем.
Непредсказуемое поведение машин
При поездках по городу машины иногда ведут себя непредсказуемо: авто может провалиться сквозь асфальт или, наоборот, подлететь в воздух, как на батуте. Во всех подобных случаях что-то не то творится с коллайдерами — невидимой геометрией, которая обозначает внутри движка твёрдую поверхность.
Почти все физические объекты, которые игрок видит на экране, по умолчанию прозрачны. Если на сцену просто добавить статичный меш камня или какого-нибудь предмета, персонаж сможет пройти сквозь него. Чтобы такого не происходило, программисты и дизайнеры вручную расставляют внутри объекта невидимую геометрию для коллизии. Это могут быть как примитивы вроде прямоугольников и сфер, так и более сложные уникальные фигуры. Иногда коллайдеры могут в точности повторять форму объектов, но это редкость, ведь лишние полигоны могут сильно загрузить систему.
Коллизии могут происходить не только при соприкосновении с твёрдыми поверхностями. Известные многим игрокам хитбоксы — это те же самые коллайдеры. Просто в некоторых играх они неосязаемы и служат лишь для передачи информации.
В ролике выше видно, что вся сцена прогружается с трудом: окружающий мир выстраивается буквально на глазах. Вероятно, коллайдер части моста попросту не успел появиться на локации, из-за чего машина и провалилась. В этом случае проблема — в оптимизации приоритетов загрузки объектов. Геометрия для коллизии должна появляться вместе с физическим объектом. В идеале, конечно, это должно происходить вдалеке от главного героя. Если система где-то не справилась, разработчики иногда добавляют в открытом мире динамическую загрузку, чтобы меньше загружать процессор и видеокарту.
Летающие авто
На этом странности с поведением транспорта не заканчиваются: иногда он неожиданно подлетает в воздух. Это касается и машин игрока, и тех, на которых передвигаются NPC.
Возможно, в случае со сценой из ролика выше тоже не обошлось без проблем с коллайдерами. Машина могла зацепиться за невидимую преграду или пропасть между частями дороги. В результате автомобилю передались нереалистично большие значения скорости или создался очень сильный разовый выталкивающий импульс.
Не исключено также, что импульс в Cyberpunk 2077 как-то привязан к фреймрейту. Такая связка нередко создаёт проблемы. На видео выше — пример из Unreal Engine 5. Белый кружок — это примитивный «актёр», на который при выстреле накладывается функция Add Force, работающая по-разному в зависимости от фреймрейта. В данном случае ограничение частоты кадров до 30 вытолкнуло кружок за пределы сцены — без этого ограничения функция отработала без проблем.
Другая возможная причина таких проблем — некорректный расчёт переменных. Для указания скорости или импульса могут использоваться как целые значения, так и числа с плавающей запятой. Во втором случае точность вычислений выше, однако возрастает риск столкнуться с проблемами. Так, система может неправильно перемножить или округлить значения. Из-за этого итоговый результат будет многократно отличаться от нужного программистам.
Классические игровые баги
В Cyberpunk 2077 также много привычных глитчей, которые встречаются повсеместно. Например, некоторые NPC периодически встают в T-позы и A-позы. Так модели выглядят до того, как их начинают анимировать. Иными словами, это их исходное состояние.
Если анимация не прогрузилась или прогрузилась с ошибкой, движок оставляет всё как есть и выставляет на сцену NPC без каких-либо анимаций. Зачастую эта проблема не мешает остальному коду, поэтому персонажи в T-позе иногда могут криво ходить или даже стрелять.
Ещё одна распространённая проблема, которую можно увидеть в Cyberpunk 2077, — неряшливая физика тел. Труп противника может повалиться на землю в неестественном положении, а отдельные конечности — начать дёргаться. В худших случаях модель и вовсе начнёт летать по всей локации. Во многих играх с ragdoll-физикой можно встретить такие нелепые сцены. Зачастую проблемы возникают, когда один объект оказывается внутри другого. В этих случаях тела пытаются оттолкнуться друг от друга, но так как они намертво скреплены, получается спонтанный брейк-данс.
Другой популярный баг — экзотическое расположение NPC. Спавнеру иногда не удаётся расставить персонажей там, где они должны быть, поэтому он возрождает их в другом месте. Возможно, в ролике ниже там и располагается невидимый спавнер — это объяснило бы столь нелогичное место появления.
Ещё одна нелепая ситуация: героя сбила машина, но он остался лежать на капоте. Это не столько баг, сколько неряшливая работа с логикой подобных ситуаций. В идеале машина должна сильно отталкивать персонажа в сторону, чтобы он точно не продолжил движение на ней.
***
Баги Cyberpunk 2077 запомнятся игрокам надолго. CD Projekt RED поставила перед собой очень непростую задачу: создать амбициозную игру в новом для себя жанре при помощи движка, который ранее использовался для принципиально других по размерам игр. Это, разумеется, не оправдывает сырое состояние проекта, но указывает на то, сколько всего может пойти не так в геймдеве. Даже несколько лет спустя специалисты студии не смогли избавиться от всех проблем — вероятно, из-за большого количества неизбежных костылей, появившихся на ранних этапах разработки.Избежать этих проблем можно при помощи грамотного препродакшена. Именно там закладываются основные элементы игрового опыта, а также масштаб проекта.