Как сделать кат сцену
Создание игры на ваших глазах — часть 8: Визуальное скриптование кат-сцен в Unity (uScript)
В одной из предыдущих публикаций я рассказывал, что мы прикрутили к нашей игре язык Lua для скриптования различных сценок. Однако, попользовавшись им какое-то время, мы поняли, что порой написание таких скриптов превращается в довольно сложночитаемый и сложноотлаживаемый код.
И мы задумались о визуальном подходе. В этой статье я расскажу о нашем знакомстве с средством визуального скриптинга для Unity — «uScript», о его возможностях и расскажу о нашем опыте.
Да, на скрине выше — реальные скрипт и схема.
Введение.
Итак, давайте для начала посмотрим на то, что было. Ниже приведен реальный скрипт, создающий двух персонажей на экране, рисующий простенький диалог, дающий юзеру выбор из 2х вариантов и ветвящийся в этом месте.
В игре это выглядит так:
В принципе, в скрипте выше нет ничего страшного. Но представьте, что у вас не 1 ветвение, а два. Представьте, что вам нужно проверять какие-то игровые параметры и ветвить скрипт исходя из них. Это очень быстро может стать ненаглядным.
Именно в такой момент нам остро захотелось визуализации.
Посмотрев несколько плагинов для юнити, мы остановились на uScript. Он очень мощный, гибкий, и при этом просто расширяемый. Кроме того, он создает минимальный impact по быстродействию, т.к. на этапе сохранения схем сразу же компилит их в C#, т.е. для Unity скрипт собранный в таком редакторе не очень отличается от скрипта, написанного руками на шарпах.
Давайте сразу приведу скрин того, во что превратился вышеприведенный LUA-скрипт. (картинка кликабельна)
Выглядит немного громоздко, но зато сразу наглядно. Когда, кто и где создается, что делает, а главное видны ветвления.
Вот, например, в нашем случае игрок может выбрать 1 ответ из двух возможных. В игре это выглядит так:
И сразу видно, что произойдет при выборе ответа №1 и ответа №2. А если таких ветвлений будет больше — то тем более схема не потеряет наглядности.
Принципы uScript.
Давайте быстро пробежимся по тому, из чего состоит схема. Собственно, основные модули (в терминологии uScript они называются «nodes») — это событие (с него обычно начинается скрипт или цепочка), action и переменные.
У action’он есть вход (обычно 1) и выход(ы). Например, у самого простого действия 1 вход и 1 выход. А у какого-нить блока условия — уже будет два выхода, например.
Снизу блока подключаются переменные. Треугольник означает, что в переменную будет произведена запись (output).
Например, в этом примере мы создаем персонажа (с помощью блока «Create char»), а потом выставляем ему же зеркальность в «true» (с помощью блока «Mirror»):
Кстати, все переменные могут иметь названия (в нашем случае «с1»). И все переменные одного типа с одинаковым названием будут синхронизированы в пределах одного скрипта (схемы). Т.е. пример выше совершенно идентичен такому:
Сделано это чтобы избавить вас от необходимости тянуть связи через два экрана.
Кроме того, если поставить галочку «expose to Unity», выбранная переменная станет public и будет видна другим скриптам (как визуальным, так и вашим рукописным). Массивы так же поддерживаются.
Немного практики.
Все модули, которые вы видите на схеме — самописные. И были написаны за 1 вечер. Давайте посмотрим на их код.
Рассмотрим сначала что-нибудь очень простое. Например, action, который называется «Start fight». Он начинает бой (по сути, вызывает метод игровой логики) и принимает два параметра — айдишник боя и айдишник соперника.
А теперь давайте усложним. Допустим, мы хотим проиграть какую-либо анимацию. И хотим иметь два выхода. Один — сразу, а второй, который запустится только когда анимация проиграется до конца.
Справа вы можете видеть блок с конфигурацией блока, куда вы вбиваете значения. У блока 3 входных параметра — CharacterGfx (непосредственно персонаж, которому мы проигрываем анимацию), Animation (название анимации) и Mirror (необходимость зеркаленья). И у блока есть два выхода: Out (выход сразу же) и Finished (только когда анимация закончится).
При этом переменная «Mirror» является энумератором с параметрами «да», «нет» и «не менять», которая представляется в виде dropdown-списка в окне свойств.
Код особо сложнее не стал:
Еще момент. Во всех блоках выше выход (Out) вызывался сразу же после выполнения кода блока.
А что если мы хотим сделать асинхронный action? Например, загрузку сцены. И чтобы выполнение нашего визуального скрипта приостановилось до того момента, пока асинхронно не прогрузится сцена.
Делается это так же просто. Вместо строчки
которая являлась флагом «скрипт всегда готов к выходу», мы пишем:
тем самым говоря — «Out теперь является хэндлером, а не вечно-истинным boolean’ном».
А далее в коде в тот момент, когда вы будете готовы продолжить выполнение скрипта, вам нужно вызвать этот хэндлер ровно так же, как было с Finished в предыдущем примере:
Не обязательно писать код самому.
Все, что я привел выше — было написано нами, чтобы собрать все, что нужно в одно удобное место. Но это зачастую не обязательно. В uScript есть такая вещь, которая называется «reflection». На деле это означает, что uScript автоматически сканирует вашу сцену и вытягивает из нее все объекты, а так же их публичные методы и параметры, до которых может дотянуться. И предоставляет к ним доступ.
Например, вот так выглядит блок-reflection на метод GetComponent() камеры на сцене:
(внизу вы можете видеть блок «properties», где задаются все параметры метода)
Выводы.
Тулза нам однозначно понравилась и мы будем юзать ее дальше. Вообще, некоторые люди умудряются с помощью нее писать целые игры, но это уже чересчур.
Насколько глубоко мы сможем ее заюзать пока не знаем. Например, еще не решили, переписывать ли логику триггеров квестов с нашей lua-ориентированной на визуальную.
Но вот для скриптования кат-сцен и диалогов будем юзать однозначно.
Из минусов могу выделить только один (который является следствием плюса) — как я писал выше, uScript преобразует визуальные схемы в C# код. А следовательно каждая модификация схемы потребует перекомпиляции проекта.
В остальном — очень советую присмотреться к этому инструменту, если вы хотите скриптовать подобную логику. Так же, насколько я знаю, этот инструмент активно используют для написания AI.
Кстати, если вам нужна именно для скриптования поведения и взаимодействия объектов на сцене (например, триггеры на столкновения и т.п.), то присмотритесь к PlayMaker. Он больше ориентирован именно на событийную модель.
Создание катсцен в играх. Перевод статьи Адама Шнитцера. Часть 1.
Катсцены, в той или иной форме, были частью компьютерных игр с самого начала. Это были грубые пиксельные анимации ранних аркадных игр, лайв-экшены, компьютерные игры с синим экраном (имеется в виду хромокей), а теперь и трехмерная анимация современных консолей. Пуристы любят говорить, что ролики — это отвлечение, ненужное и раздражающее вторжение в целостность игры. Геймплей — король всего! И даже те, кто любит катсцены, должны признать, что бывают моменты, когда они получают слишком много хорошего. В некоторых играх так много катсцен или таких длинных катсцен, что вы должны задаться вопросом, не задумывались ли разработчики игр о фильме. А есть игры с такими скучными, запутанными, непродуманными катсценами, что было бы лучше, если бы они вообще не создавали какие-либо катсцены.
Когда вы покидаете интерактивный мир игры и входите в кинематографический мир катсцены, правила меняются. Вы покидаете непрерывный, спонтанный мир операторской съемки на лету и попадаете в мир традиционной кинематографической структуры. Как человек, который работал как в игровой индустрии (в LucasArts), так и в киноиндустрии (в Pixar), я смотрю ролики в играх с острым пониманием кинематографического дизайна. Съемочные композиции, постановка, вырезка, ритмика: каждый аспект того, что видно на катсцене, имеет выразительную важность и есть именно так, как есть, потому что кто-то решил, что так и должно быть.
Правила, по которым принимаются эти решения, являются правилами языка фильма. К сожалению, игровые ролики часто задумываются в незнании основной грамматики этого языка. А когда вы плохо понимаете правила грамматики, вам трудно четко выразить себя.
Шаг 1: Знай свою цель
Первый шаг в создании лучших катсцен — это понять, каковы твои цели.
• Продвигайте сюжет и придавайте смысл динамическому прогрессу игры. Лучшие игры развиваются динамически, а это значит, что по мере того, как вы играете в игру, ставки становятся выше, а характер вашего участия становится более интенсивным. Это то, что происходит в истории тоже. По мере продвижения сюжета ставки становятся выше, пока вы не достигнете кульминации истории, когда решатся главные проблемы. Смешивание динамики истории с динамикой игры придает игровому процессу еще один смысл.
• Определите начало и конец игрового уровня. Кат-сцена в начале уровня устанавливает сцену для следующего действия. В конце уровня заставка сигнализирует игроку, что он достиг целей этого уровня.
• Дайте игроку награду. Катсцены позволяют игрокам отдохнуть и просто насладиться процессом. Пусть после выполнения сложного задания, катсцена будет наградой для игрока.
• Введите элементы игрового процесса и предоставьте игроку необходимые подсказки. Предоставление игроку необходимых подсказок и информации, которые ему необходимы, похоже на предоставление зрителю фильма информации предыстории, которая делает действие истории понятным. Слово «экспозиция» работает в обоих контекстах.
• Установить настроение. Создание полностью реализованных, предварительно отредактированных катсцен делает многое для того, чтобы установить правильное настроение и погрузить игрока в свою историю. Таким образом, игрок получает представление о том, каким может быть «на самом деле» воображаемый мир игры. Когда начнется игровой процесс, игрок будет держать эти сцены в своем воображении и через эти изображения с высоким разрешением будет видеть визуально истощенный, низкополигональный мир игры.
• Определите мифологию игры. Одна из вещей, которая привлекает игрока в игру — это то, что я бы назвал «мифологией», которая его окружает. Эта мифология определяется персонажами, окружающей средой, реквизитом и общим видом игры. Но, больше всего, это определяется историей. Эта мифология — это, что игроки игры либо купят, либо нет. Это один из ключевых элементов, который может сделать или сломать продукт. Катсцены — это место, где эта мифология выражена наиболее убедительно.
• Маркетинг — это вторичное назначение роликов. Если дерево падает в лесу, и никто его не слышит, издает ли оно звук? Если игровая компания делает отличную игру, и никто ее не покупает, имеет ли значение, что она великолепна? Печальный факт заключается в том, что вы можете сделать лучшую игру в мире, но если пресса и покупатели магазина не заметят этого, вам будет сложно заставить кого-либо купить ее и сыграть в нее. И, если никто не играет в нее, то можно считать, что этой игры не существует. Существует огромное количество игр, поэтому за 10 или 15 секунд, которые у вас есть на E3, чтобы привлечь внимание прессы, вам захочется показать им что-то, что собьет их с ног.
Шаг 2: Предварительная визуализация
Второй шаг в создании лучших катсцен — это планирование. В этом случае другое название для «планирования» — «предвизуализация». Чтобы понять, как предварительная визуализация вписывается в конвейер производства, стоит потратить немного времени, чтобы посмотреть, как работает весь процесс создания анимации.
Ролики сделаны так же, как любая анимация. Неважно, создается ли анимация для игры в мультфильме, есть определенный порядок, в котором все должно идти. В качестве примера базовой модели производства анимации я хотел бы рассказать о том, как все работает в Pixar, когда я работал там над A Bug’s Life, Toy Story 2 и Monsters Inc.
• Сценарий, концептуальный дизайн и раскадровка. В анимации эти три действия происходят одновременно. В отличие от живого боевика, где вам нужно иметь сценарий, прежде чем вы сможете начать раскадровку, с анимацией раскадровка и концептуальный дизайн происходят вместе с разработкой сценария как равные части процесса создания истории.
• Аниматика. Как только раскадровки начинают придавать форму сценам, Редакционный департамент начинает собирать их вместе в сюжетный ролик или аниматику. Я расскажу больше об аниматике через минуту.
• Моделирование. После того, как история развивается до такой степени, что компания чувствует себя заинтересованной в превращении ее в фильм, отдел моделирования начинает создавать все персонажи и декорации, которые были разработаны художественным отделом в концептуальных проектах.
• Голос. Актеры озвучиваются и голосовые линии записываются.
• Гардеробная. Отдел декораций отвечает за сбор всех реквизитов и их сборку для формирования декораций, в которых происходит каждая сцена.
• Макет. Это этап, на котором каждый кадр, который был запланирован в раскадровке, наконец-то соединяется в трехмерном мире с персонажами и наборами, предоставленными отделом моделирования. Я расскажу более подробно о макете через минуту.
• Эффекты.
Обратите внимание, что перед этапом анимации происходит много вещей. Чтобы использовать театральную аналогию, анимация — это часть процесса, когда актеры выходят на сцену и выступают. Но прежде чем выступить, нам нужны репетиции. В конвейере анимации «предварительная визуализация» — это «репетиция».
Предварительная визуализация — это то, где вы можете ответить на все критические вопросы кинопроизводства. Как должно быть организовано действие? Где должна располагаться камера? Как должен быть составлен выстрел? Будет ли эта последовательность снимков действительно рассказать нашу историю? Можем ли мы быть более краткими? Где должен произойти разрез? Как дела?
С предварительной визуализацией режиссер может видеть общую картину и ясно думать об общем кинематографическом дизайне. Сосредоточив внимание на постановке и кинематографе перед анимацией персонажа, он способен выделить измерение производства, которое действительно требует отдельного внимания.
Предварительная визуализация требует затрат времени и рабочей силы, которая отнимает ресурсы у других областей вашего проекта, поэтому неизбежно возникнет вопрос: «Действительно ли нам нужно это делать?» Ответ — «да», и причина в следующем: анимация отнимает много времени и стоит дорого. На RTX Red Rock мы обнаружили, что в хороший день мы можем ожидать, что аниматор будет производить одну секунду анимации в час. Это восемь секунд в день или 40 секунд на аниматора в неделю. (Кстати, в Pixar среднее недельное значение для аниматора составляет около 12 секунд.) Методы предварительной визуализации, которые я опишу, являются быстрыми и дешевыми для сравнения. В течение времени, которое требуется аниматору для анимации одного снимка, художник-макет будет работать с целой последовательностью снимков. Имеет смысл работать от самого быстрого и дешевого до самого медленного и самого дорогого способа представления истории. Решение всех кинематографических проблем до начала анимации позволяет избежать больших затрат впустую. Ожидание анимации кадра, прежде чем понять, что он действительно должен быть вырезан, тратит гораздо больше времени, чем понимание того, что его следует вырезать на этапе предварительного производства.
Три техники предвизуализации
Я сосредоточусь на трех методах предварительной визуализации, которые выходят за рамки раскадровки для планирования вашей анимации. Два из них, «Аниматика» и «Соединение кадров», являются частью производственного конвейера Pixar. Другой — видеоматика, метод, позаимствованный у ILM.
Раскадровки и анимация — это первый шаг к тому, чтобы сделать скрипт видимым. Это также самый быстрый и дешевый способ визуального представления вашей истории. Раскадровки представляют фундаментальные действия каждой сцены: что делает и чувствует каждый персонаж, и как они соотносятся с тем, что вокруг них.
Основным ограничением раскадровки является то, что оно не дает вам хорошего представления о шаге. Как долго будет длиться сцена? Чтобы выяснить это, нужно превратить раскадровки в анимационные.
Аниматика создается путем сканирования каждой панели раскадровки в компьютер, импорта ее в цифровую систему редактирования и обрезки последовательности вместе в синхронизированной дорожке диалога. Музыка и звуковые эффекты также часто добавляются.
Ценность аниматики состоит в том, чтобы дать вам лучшее представление о том, насколько хорошо срезаются кадры, как долго будет работать ваша сцена и будет ли она интересной в этом темпе.
2. Распределительная встреча
С анимированным соединением пришло время разбить собрание. Встреча по сбору — это собрание всех людей и отделов, которые будут нести ответственность за создание катсцены. На встрече все смотрят анимацию, а затем задают вопросы и высказывают опасения. К концу встречи все должны иметь четкое представление о том, что от них ожидают… Эта встреча является важной частью производственного процесса, потому что именно в этот момент колеса производства действительно приводятся в движение. Предоставление каждому участнику возможности выразить свою обеспокоенность и повлиять на то, как будут разработаны снимки (в пределах разумного), поможет избежать большого количества дополнительной работы, не говоря уже о негодовании, в будущем.
Обычно встреча с разбивкой происходит после завершения анимации. Но также возможно провести совещание, посвященное срыву видео, посвященное видео.
Невозможно считать, что вы можете проработать все детали постановки в раскадровке или даже в аниматике. Раскадровки имеют тенденцию подчеркивать отношения и действия персонажей, а не точную композицию каждого кадра. Разрыв между 2D-миром раскадровок и 3D-миром анимации оставляет слишком много места для просчетов, когда вы пытаетесь понять, как на самом деле будет выглядеть кадр. Макет и видеоматика, поскольку они происходят в трехмерных мирах, позволяют более точно представить, как на самом деле будет работать снимок. Угол камеры, движение камеры, размер снимка, выбор объектива — все эти решения сильно влияют на драматическое воздействие сцены.
Макет и видеоматика напрямую решают два основных вопроса, которые стоят перед любым режиссером: где будет расположена камера и как персонажи будут двигаться перед камерой?
Независимо от того, подходите ли вы к этапу макета с видео в руке или нет, процесс макета не может быть пропущен. Помимо того, что это метод предварительной визуализации, макет также является первым шагом в фактическом производстве кадра. Чтобы начать работу с макетом, вам понадобятся сценарий, раскадровки, модели персонажей, голос и набор 3D.
В макете блокировка персонажа делается самым простым способом рассказать историю. Цель состоит в том, чтобы установить основные метки в сцене, которые должен нанести аниматор, и как можно точнее установить тайм-аут движения персонажа. В то время как внешний вид блокировки персонажа примитивен, метки, которые воздействуют по таким вещам, как повороты головы, начало и остановка прогулок, жесты рук или рук и т.д., рассчитаны очень точно. Идея состоит в том, что когда кадр наконец переместится из Макета в Анимацию, для работы аниматора будут установлены основные параметры.