Всем пятница!
Продолжаем учиться у Вайта Ченга делать компьютерные игры. Вторая часть лекции посвящена системе управления Diablo 3.
СИСТЕМА УПРАВЛЕНИЯ
Предупреждаю, на эту тему я могу рассуждать целый день. Я фанат этого дела. Думаю, что сделать удобную систему управления очень сложно, но хорошая игра должна ее иметь. В Diablo 3 всего 6 активных способностей, поэтому, казалось бы, все просто - вывести на панель клавиши с 1 по 4 и задействовать две кнопки мыши.
Однако, мы столкнулись с серьезной трудностью с "пропавшими" кликами, которая преследовала нас на протяжении всех этапов разработки. Diablo - это игра, где клавиши на клавиатуре и кнопки мыши нажимаются очень часто и, порой, одновременно. А анимация персонажа должна реагировать на нажатия - именно это создает чувство связи игрока и персонажа. Вы даете команду - персонаж должен ее исполнить. Но что делать, если игрок посылает одновременно несколько команд?
Для того, чтобы разобраться в проблеме, придется углубиться в детали процесса анимации.
В среднем, одно действие персонажа анимируется 18-28 фреймами, в которых должны обязательно присутствовать 3 точки: начало, контакт с целью и конец.
Начало служит индикацией того, что команда получена, и начинается ее выполнение. Обратите внимание, как выделяется силуэт варвара в первой стадии. Мы сразу даем игроку четкий сигнал, что команда получена и выполняется. Это придает игре чувство отличной управляемости.
В диапазоне от 1/4 до 1/3 от всего процесса анимации лежит фаза контакта оружия с целью. Именно этот временной интервал дает ощущение веса и инерции оружия, но не создает ощущения паузы между командой и ударом. Разница в интервале между контактом и окончанием удара создает ощущение разницы между тяжелым/медленным и легким/быстрым оружием.
Замечу, что мы даем двигаться персонажу во время анимации, что придает всему процессу особый шик.
Теперь вернемся к проблеме одновременного срабатывания нескольких команд. Рассмотрим ее на примере визарда, который решил одновременно применить Magic Missile (Магическая стрела), Arcane Orb (Магическая сфера), Blizzard (Снежная буря) и Ice Armor (Ледяной доспех).
Стрела летит быстро и поражает одну цель. Сфера летит медленно и наносит урон по области. Blizzard - это ледяной дождь, который я могу вызвать и двигаться дальше, пока он будет действовать. Ice Armor - это бафф, который выглядит, как лед вокруг персонажа, и замораживает атакующих монстров.
Итак, что же делать, если игрок прожал все способности одновременно?
Первая идея, которая пришла к нам в голову состояла в том, чтобы ранжировать виды анимации по приоритету: первичные и вторичные. Первичная анимация должна выполниться обязательно во время применения способности. Если игрок выпустил заряд, а мы это не отрисуем, мы не можем нанести урон этим невидимым зарядом, потому что игрок сразу почувствует ненормальное поведение системы. Вторичная анимация выполняется только тогда, когда на это есть время, и невозможность ее отрисовки не приводит к отмене действия способности.
Например, анимация Ice Armor имеет вторичный приоритет. Можно одновременно атаковать и накладывать этот бафф. При этом анимация Ice Armor показывается не полностью, но способность работает.
Мы считаем, что добились успеха. Все работает, игрок ощущает полный контроль над персонажем и не задумывается о том, стоит ли прерывать свои текущие действия, чтобы наложить бафф.
Это новшество сильно улучшило ситуацию с "потерянными" кликами, потому что нам удалось значительно сократить время на отрисовку анимации.
Вторая идея по борьбе с водопадом кликов была в том, чтобы прерывать способности. Например, игрок прожал стрелы, сферы, а затем сразу заказал бурю. Так давайте прервем все, что не успело отрисоваться, и покажем бурю. (Показывает видео, где анимация первых способностей прерывается, и начинается анимация следующих).
Реализация этой идеи сильно увеличила отзывчивость персонажа на действия игрока и несколько повысило его DPS. Повышение урона и потерю части анимации я считаю приемлемыми жертвами на пути повышения управляемости персонажа.
Гораздо важнее было то, что мы все еще теряли часть команд, которые прерывались до стадии контакта с целью. Игрок мог быстро колотить по кнопкам, и ничего не происходило - он сам прерывал свои способности. В таком виде игру нельзя было выпускать.
Следующая идея была организовать очередь. Этот способ используют многие игры жанра RPG, но мы побаивались этой системы, и вот по каким причинам.
Во-первых, мы уже находились в стадии бета-тестирования, и сроки поджимали. Обычно, в это время все системы только полируют, а не делают все заново. Но мы верили, что хорошая система управления нам очень нужна. Поэтому мы сели за стол и стали думать.
Было принято решение, что даже если ради отличной системы контроля нам придется задержать выход игры, то мы пойдем на это. Мы были готовы сократить или вовсе отложить работы над другими системами ради хорошей системы контроля.
Во-вторых, мы видели игры, где очереди были реализованы, и это не улучшило их систему управления. В некоторых других ARPG система управления с очередью создавала ощущение потери контроля над персонажем.
Например, представьте что вы нажали пять раз подряд на способность выстрела и беспомощно наблюдаете, как персонаж делает пять выстрелов один за другим.
Чтобы избежать эффекта потери управления над персонажем, мы ввели некоторые правила.
Во-первых, в очередь не может попадать более одной команды. Это правило является базовым, и его используют многие разработчики. Во-вторых, очередь не может быть длиннее 0.5 секунды, чтобы игрок не терял возможности управлять персонажем надолго.
Самый интересный вопрос - что делать, если игрок захотел поставить в очередь сразу две команды. И тут мы выбрали такой путь - мы отдаем приоритет той команде, которая отличается от предыдущих.
Представьте, что игрок стреляет, стреляет, стреляет, стреляет... и вдруг захотел кинуть сферку. С точки зрения игрока, сфера сейчас гораздо важнее, чем выстрелы.
А что, если после стрел игрок прожал сферу и бурю? Какую команду выполнить? Опыт показывает, что игрок ожидает выполнение той команды, которую он послал последней, но без прерывания текущей.
Вот с такой системой управления мы пришли к релизу. Есть кое-какие проблемы, завязанные на способности с движением, вроде Вихря, но они незначительны.
Чему мы научились? Сделать хорошую систему контроля очень тяжело. И это происходит в каждой игре, которую я разрабатывал. Если вы хотите получить рабочую систему, вы должны вводить специальные правила для особых случаев и думать, а чего игрок хочет в данный момент?
Часто разработчики удивляются, почему надо так много сложных правил, чтобы реализовать простые вещи? В ответ я привожу пример с задачей распознавания речи. Она из того же класса простых, с точки зрения человека, интерфейсных задач, которые решаются при помощи множества сложных правил.
Продолжение следует...