Официальный релиз игры Uncharted 4 уже состоялся, и теперь я могу рассказать, что именно разрабатывал для этого проекта. В основном я был занят созданием искусственного интеллекта для неигрового персонажа (НП) из одиночной игры и для ботов из мультиплеера, а также работал над кое-какой игровой логикой. В этой части статьи я расскажу об управлении транспортом, поведении НП при диалогах и локализации игры на китайский язык.
Предыдущая часть статьи — тут.
Медики
Медикам из режима мультиплеера нужно было задать совершенно новый тип поведения, который не встречается ни у одного НП в одиночной игре: следить за ранеными союзниками и повторять поведение игроков в укрытии.
Медики стараются подражать поведению игроков в укрытии и держаться на максимально близком расстоянии, чтобы при необходимости быстро прийти на помощь. Если поблизости ранят союзника, медик оживит и его, но при условии, что в данный момент не ранен игрок. Если у игрока есть RevivePak мод, медики будут бросать ему аптечку (RevivePak) перед тем, как бежать на помощь, – это помогает экономить время на восстановление. При броске аптечки полностью повторяется логика и анимация броска гранаты – за тем лишь исключением, что вместо гранаты используется аптечка.
Скрытность
Еще одна новинка в игре – участки с высокой травой, которые повышают скрытность игрока и позволяют незаметно красться. Мы нанесли разметку на участки с травой, чтобы с точки зрения игровой логики было понятно, когда игрок становится незаметным. Изначально мы планировали поручить художникам по фонам создать в Maya модель столкновений для участков с травой. Но коммуникация между художниками и дизайнерами сильно увеличивала время итерации. Потому мы выбрали другой подход и остановились на разметке участков, как показано ниже. Дизайнеры получили в распоряжение новый тег, позволяющий размечать участки с высокой точностью. Имея эти дополнительные данные, мы также можем оценивать точки скрытности, основываясь на том, находятся они в траве или нет. Это оптимизирует поведение НП, позволяя им понимать, когда игрок переходит в режим скрытности, и повторять за ним.
Уровни тревоги
Поскольку в Uncharted 4 нет режима слуха, как в The Last of Us, нужно было придумать способ сообщать игроку об угрозах, чтобы не заставать его врасплох. Потому мы внедрили цветные индикаторы тревоги, которые основываются на данных о восприятии противниками окружающей обстановки. Индикаторы уведомляют игрока о том, что противник сейчас заметит (белый) или уже заметил (желтый) подозрительную активность около себя, или же обнаружил игрока (оранжевый). Вместе с индикатором мы используем жужжащий звук на фоне, который создает напряжение, а также резкий и короткий звук (как в The Last of Us), сигнализирующий о том, что о присутствии игрока стало известно.
Проведение осмотров
Это одна из последних крупных особенностей игры, в разработке которых я принимал участие. Был период, когда в Naughty Dog практически каждую неделю проводились митинги под руководством Брюса Стрэли или Нила Дракманна. На этих митингах особое внимание уделялось разработке ИИ в игре, и почти на каждом из них принималось решение что-то изменить или доработать в системе проведения осмотров. С ней нам предстояло пройти очень много итераций, прежде чем получилось то, что в итоге вошло в финальную версию.
Когда противники замечают что-то подозрительное, они идут осмотреть соответствующий участок. Обычно к этому побуждают два обстоятельства: найденное тело или признаки непосредственного присутствия игрока. Заметивший подозрительную активность противник постарается подозвать кого-нибудь из своих приятелей поблизости, чтобы провести осмотр вместе. Тот из них, кто ближе всего находится к источнику подозрительной активности, становится осмотрщиком, а другой – наблюдателем. Соответственно, заметившему может достаться любая из этих ролей, и специально для этого мы проработали разные варианты диалогов: «Я что-то заметил там, пойду проверю» или «Я что-то заметил там, иди проверь».
Чтобы начало и конец осмотра выглядели естественно, мы разнообразили действия противников и время нормализации их индикаторов тревоги. Таким образом, осмотрщик и наблюдатель не будут действовать механически, синхронно выполняя одинаковые действия.
Если обнаруживается тело, осмотрщик сразу поймет, что игрок где-то рядом. Он окончательно выйдет из состояния покоя и скажет остальным начать поиски игрока. Обнаруженное тело тоже будет подсвечено, чтобы игрок знал, что именно его выдало.
На более высоких уровнях сложности при осмотрах противники могут вести себя более агрессивно, повышая шансы обнаружения игрока, который притаился в траве. На уровне сложности Crushing противники всегда будут вести себя агрессивно при осмотрах.
Поведение при диалогах
Под поведением при диалогах подразумевается логика, заставляющая персонажей определенным образом реагировать на реплики друг друга: при помощи жестов, взглядов, и т. д. Ранее у команды разработчиков The Last of Us ушло несколько месяцев на то, чтобы вручную прописать персонажам реакции для всех диалогов. Но нам не хотелось проделывать такой же объем работы. У нас были кое-какие диалоги с прописанным вручную поведением, но нам нужна была система, которая позаботилась бы об остальных репликах. Аниматоры получили параметры для настройки скорости поворота головы, максимального угла поворота, продолжительности взгляда и т. д., и в итоге нам удалось добиться неплохих результатов.
Управление транспортом
Одна из первых трудностей с системой вождения, возникших при тестировании на уровне Мадагаскар, заключалась в том, что при столкновении со стеной или машиной противника джип игрока резко терял скорость. В результате игрок оказывался позади конвоя и проигрывал уровень.
Я предложил временно ограничивать угловую скорость и изменение направления линейной скорости при столкновении. Это простое решение в итоге оказалось очень эффективным, и теперь риск проиграть из-за резкой потери скорости минимален.
Повреждение транспорта
В Uncharted 4 впервые за всю историю линейки появилась возможность управлять транспортными средствами. В предыдущих частях за рулем сидели НП, и движение осуществлялось строго по закрепленным маршрутам.
Я помогал разрабатывать систему повреждений. Существует много способов вывести из строя транспорт противника: выстрелить в него достаточное количество раз, убить водителя, сбить мотоцикл или протаранить и перевернуть джип противника вашим джипом. В зависимости от выбранного способа с пассажирами будет проигрываться та или иная анимация. Реалистичность картинки создается за счет использования рэгдоллов с учетом всех законов физики. В итоге анимация плавно переходит в физическую симуляцию обломков.
Для имитации уничтожения мотоцикла от столкновения мы использовали два типа данных: место пересечения его невидимой рамки в плоскостях XZ (см. изображение ниже) и точку соприкосновения с машиной игрока. На основе этих данных система подбирает одну из четырех анимаций разрушения.
Что касается переворота джипа, для этого вращательное отклонение джипа от желаемого направления движения сверяется с порогом переворота.
При проигрывании анимации разрушения существует вероятность, что автомобиль или мотоцикл пройдет сквозь стену. Чтобы решить это, мы использовали сферу, вытянутую от точки идеального положения транспорта вдоль пути, как если бы он не был уничтожен, до точки, в которой непосредственно находится сам транспорт. Если сфера вступает в контакт с поверхностью, транспорт сдвигается по направлению нормали к точке контакта, насколько этого требует степень проникновения. Всё это происходит постепенно, на протяжении многих кадров, и таким образом столкновение предотвращается.
Мы также разработали особо зрелищный вид разрушения транспорта, для которого был создан ряд специальных анимаций уничтожения, чувствительных к контексту и способных взаимодействовать с окружением. Аниматоры и дизайнеры разместили вдоль кривых, по которым предполагается движение транспорта, ряд так называемых окон. Если игрок уничтожает единицу вражеского транспорта в пределах такого окна, запускается специальная анимация разрушения. Одним из примеров является эпический взрыв джипа в деморолике 2015 E3.
Матрица Байера и дизеринг
Нам не хотелось, чтобы камера просто отсекала объекты окружения, когда она приближается к ним слишком близко. В особенности это касалось листвы. Потому мы решили размывать пиксели в пиксельных шейдерах по мере их приближения к камере. Использовать прозрачность было бы слишком затратно, к тому же в игре очень много листвы и это могло повлиять на производительность. Мы прибегли к дизерингу. При сочетании данных расстояния пикселя от камеры со структурированной матрицой Байера часть пикселей полностью отсекалась, создавая иллюзию прозрачности.
Изначально мы использовали матрицу Байера размером 8х8, как описано здесь. Но мне показалось, что она слишком мала, к тому же после нее на картинке оставались артефакты в виде концентрических кругов. Я хотел использовать матрицу Байера размером 16х16, но ее было не найти в интернете. В итоге я попытался проанализировать и переработать паттерн матрицы 8х8 и выявил в нем закономерность. Конечно, можно было сделать это вручную, но мне захотелось немного развлечься, и я написал инструмент, позволяющий генерировать матрицы Байера для любой степени двойки.
Заменив матрицу, мы добились заметного прогресса в борьбе с артефактами.
Задержка звука при взрыве
Это очень незначительная правка, но мне всё равно хотелось бы упомянуть о ней. За пару недель до выхода деморолика 2015 E3 я обратил внимание на одну вещь: во время взрыва башни звук от взрыва доносился сразу, а не с задержкой. Это было неправильно, потому что Салли и Нейт находились на приличном расстоянии от нее. Я сообщил об этом просчете, и в итоге задержка звука была добавлена в финальную версию ролика.
Локализация на традиционный китайский язык
Так получилось, что с локализацией на традиционный китайский язык мне удалось ознакомиться всего за две недели до релиза игры. К своему удивлению, я обнаружил там несколько ошибок. Большая их часть была обусловлена дословным переводом с английского, вследствие чего текст выглядел неестественно. Я не рассчитывал за такой короткий срок самостоятельно пройти всю игру на китайском, попутно выявляя переводческие ошибки. Поэтому я попросил нескольких людей из отдела QA пройти отдельные главы игры на китайском и записать это на видео. Затем я просмотрел все видеозаписи и отметил найденные в них ошибки, после чего передал все материалы команде локализации. Таким образом нам удалось исправить все ошибки в срок.
Вот и всё
Это всё, что я хотел рассказать. Надеюсь, вам понравилась моя статья.
Автор: Plarium