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



Эта статья входит в серию публикаций под названием My Career.

Система точек


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



Система следования за игроком


Система следования НП за игроком была взята из The Last of Us. Согласно ее принципу, НП выбирают позади игрока, за которым они следуют, определенную позицию из нескольких возможных. Система рассматривает только те позиции, которые проходят ряд клиренс-тестов прямой: тесты прямой от игрока до позиции, от позиции до прямо спроецированной позиции и от прямо спроецированной позиции до игрока.



В The Last of Us отсутствует возможность лазания по вертикальным поверхностям. Чтобы правильно реализовать ее в Uncharted 4, мы добавили селектор точки лазания. Он выбирает для неигровых персонажей точки лазания, по которым они будут взбираться, следуя за игроком.



Но всё оказалось сложнее. Нельзя просто дать команду идти за игроком, когда он идет, и использовать точки лазанья, когда взбирается по стене. Если игрок быстро меняет плоскость передвижения с горизонтальной на вертикальную, НП начинают двигаться рывками, не в силах выбрать одно из двух состояний. Потому мы добавили в логику поведения НП небольшое отставание, чтобы они меняли состояние только после того, как сам игрок изменит состояние и преодолеет таким образом некоторую дистанцию. Прием с отставанием в целом хорошо помогает справляться с рывками в поведении НП.

Система ведения игрока


В некоторых эпизодах нам было нужно, чтобы игрок следовал за НП, а не наоборот. Для этого мы позаимствовали систему ведения игрока из The Last of Us и немного изменили ее. Маршруты движения были размечены для НП сложными кривыми.



На уровнях с не одним маршрутом дизайнеры разместили несколько кривых, которые включаются и выключаются с помощью скрипта.



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

Мы также реализовали динамическую скорость движения. С учетом расстояния между НП и игроком мы разбили кривые маршрутов на скоростные отрезки. НП могут передвигаться в трех скоростных режимах: ходьба, легкий бег и быстрый бег. В зависимости от того, на каком скоростном отрезке находится игрок, НП выбирает соответствующий режим движения, чтобы держаться на определенной дистанции впереди. Дизайнеры могут включать и отключать эти скоростные отрезки на свое усмотрение. К тому же, скорость анимации движения НП может незначительно варьироваться с учетом расстояния от игрока. Это необходимо, чтобы минимизировать резкие изменения скорости движения НП при смене режима передвижения.



Поведение в укрытии


Система поведения в укрытии в игре The Last of Us имеет интересную особенность: игрок может беспрепятственно ходить возле НП, и при этом они оба будут оставаться в укрытии.



Это удобно еще и потому, что позволяет Джоэлу придерживаться за стену, как бы прикрывая собой Элли и Тесс, которые гораздо миниатюрнее. Но в Uncharted 4 это выглядело бы не так удачно, потому что Нейтан, Сэм, Салли и Елена имеют схожее телосложение. К тому же темп этой игры гораздо быстрее, и если Нейту во время перемещения в укрытии придется таким же образом придерживаться за стену, это нарушит плавность его движений. Потому мы сделали так, чтобы НП просто прижимались к стене, когда Нейт хочет пройти мимо:



Логика очень простая: если проецируемое положение игрока, основанное на его скорости, вмещается в пределы прямоугольной границы вокруг точки прикрытия НП, персонаж меняет свое поведение и быстро прижимается к стене, как на картинке ниже.



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

Комментарии (8)


  1. nightvich
    08.05.2017 17:57
    +1

    Тема не раскрыта, может дальше будет интереснее…


  1. miga
    08.05.2017 23:22
    +3

    Помню как году в 2003-м для своих самодельных карт расставлял я waypoint-ы для CS-бота PODBot. Технологии с тех пор, судя по всему, не сильно шагнули вперед :)


    1. elepner
      09.05.2017 10:16
      +1

      Не чини то, что не ломалось :)


  1. Ghool
    09.05.2017 10:14
    +1

    Про укрытия в обоих играх был забавный ээ баг:
    Если я игрок в укрытии, союзник считался в укрытии вне зависимости от реального положения.

    То есть если Джоэл или Нейт (игрок) подкрадывается к врагу сзади, Элли или Сэм (партнёр) может бегать перед врагом, а тот и в ус не дует, и тревогу не поднимает.


    1. JavaFox
      09.05.2017 19:27

      О да. Это с одной стороны меня напрягало в TLOU, но ИИ союзников там не самый умный, поэтому лучше уж так, чем покупка нового пада после пары десятков неудач из-за союзников


    1. fa1con
      10.05.2017 17:16

      это сделано вроде как было специально, чтобы не портить игроку стелс


  1. BlastPy
    10.05.2017 17:16
    -1

    Прокоментируйте пожалуйста вот ето.
    http://coub.com/view/tqa8k


  1. Stasgar
    10.05.2017 17:16

    Ребята делают свою работу на высшем уровне. Выжимают самый максимум из текущих возможностей человечества по созданию анимации :)