Игровые движки и среды для разработки
С развитием программного обеспечения, ориентированием на визуальное программирование, развитием обучающих курсов, а значит, доступностью для широкого круга интересующихся нарративные дизайнеры и игровые сценаристы все чаще обращаются непосредственно к игровым движкам. Существуют плагины, где не требуется особое мастерство в искусстве скриптования, все вполне приемлемо для творческого человека, а главное, можно сразу протестить проект, никуда его не портируя.
Unity — один из самых популярных движков среди разработчиков мобильных игр, работающий с языком программирования C#. Условно бесплатный. Это кросс-платформенная среда разработки, в которой можно создавать проекты и для PC, и для игровых консолей, и под мобильные системы Android и IOS, более того, делать приложения с дополненной и виртуальной реальностью. Для написания интерактивных историй можно использовать такие популярные плагины, как Dialogue System, Fungus и Merino, а в качестве визуализации и музыкального наполнения весьма актуальны ассеты из фирменного онлайн-магазина, которые скачиваются прямо в Unity.
Unreal Engine (UE) – это кросс-платформенный игровой движок на С++ от компании Epic Games, история которого идет с 1998 года. Бесплатный, но разработчики использующих его приложений обязаны перечислять 5 % роялти общемирового дохода от запущенных на нем проектов. UE позволяет создавать игры для PC, консолей, iOS, Android, приложений с виртуальной и дополненной реальностью, Wii и других. Самой полезной функцией движка для нарративных дизайнеров и игровых сценаристов является система визуального программирования Blueprint, позволяющая быстро делать прототипы интерактивных историй. В онлайн-магазине Unreal Engine Marketplace огромный выбор различных ассетов, в том числе редакторы диалогов, позволяющие довольно просто работать с нарративными проектами.
Articy: draft 2 и 3 — движок прекрасно приспособлен для создания интерактивных историй и игр с разветвленным глубоким сюжетом, весьма востребован у гейм-дизайнеров и игровых сценаристов на разных проектах: от казуальной игры до ролевой. Знание кода не требуется – интерфейс рассчитан на визуальное программирование. Бесплатную урезанную версию можно скачать и использовать для создания небольшой истории, ограничение в 660 объектов. Данный инструмент позволяет проектировать уровни, встраивать инвентарь и предметы, работать с хабами и локациями, контролировать персонажей и взаимодействия с игровыми сущностями, выстраивать сложные диалоговые деревья, назначать переменные и интегрировать кондишены по ним. Существует две версии: однопользовательская – для индивидуальной работы сценариста и многопользовательская – для совместной командной работы. Проект articy: draft экспортируется в движки Unity, Unreal Engine, в формат JSON, Word и таблицу Excel. Среди игровых проектов, прибегавших к этому инструменту: Disco Elysium, Suzerain, HipWitch, Saint Kotar, Gardenscapes, Spellforce 3 и другие.
Глава 11Переменные. Программистская логика в структуре сюжета
При выстраивании сложных сюжетных ветвлений сценаристу не помешает разобраться в программистской логике, чтобы значительно облегчить себе работу. Это не значит, что каждому, кто захочет заниматься интерактивными историями, следует тут же записываться на курсы по изучению языков программирования и уметь кодить. Отнюдь нет!
Существует немало других возможностей и методов обойтись без сложных математических систем, выстраиванию баланса и созданию проекта, о чем мы уже говорили в главе 10 «Как это сделано». Нам хорошо бы разобраться в базовой логике выстраивания повествования с помощью самых простых переменных и их наборов. Мы не будем погружаться в глубины программистской архитектуры и философии, а лишь затронем те сущности, которые стоит знать игровому сценаристу и нарративному дизайнеру при создании интерактивных историй разных жанров.
Что такое переменные?
Термин «переменная» – это перевод английского слова variable, в этом значении он активно используется в программировании. Если говорить формальным языком, то это понятие обозначает поименованную или адресуемую иным способом область памяти, которую можно использовать для доступа к данным.
Переменная – это хранилище данных с каким-то значением, которое впоследствии может использоваться в программе.
Вначале мы, конечно, должны обозначить переменную, придумать ей имя – задать, то есть сделать ей своеобразную «упаковку» – инструкцию (instruction). Для этого применяются разные языки программирования, и переменные назначаются в зависимости от синтаксиса. Обычно переменные задаются английскими словами на латинице – для распознавания кода большинством программ. Пробелы не используем, они вообще являются страшным проклятьем в коде, так как не сразу заметны, надо быть внимательнее и обязательно удалять их. Вместо пробелов можно использовать нижнее подчеркивание или воспользоваться системой CamelCase (с англ. «ВерблюжийРегистр», также «ГорбатыйРегистр»), где каждое выделенное слово в переменной начинается с большой буквы. К примеру, RedMagicHat. Программисты вам скажут спасибо!
Что же это за «упаковка» такая? Давайте попробуем визуализировать ее на примере.
Представим себе, что находимся в гостях у Деда Мороза, а именно в его мастерской, где в мешочках и коробочках находятся подарки, – пусть это и будут наши хранилища данных с переменными. Каждый подарок на учете у Деда Мороза и упакован – имеет инструкцию. Он запечатан до той поры, пока не будет вручен ребенку и открыт, то есть пока данная переменная не будет использована.
При этом, если представить переменную в виде подарочной коробочки, например назовем ее box, то внутрь мы можем положить какую угодно игрушку для ребенка – doll.
И мы можем менять игрушку столько раз, сколько потребуется.
box = 'doll!';
box = 'bear!';
И так далее. Все зависит от концепции использования переменных в нашем проекте.
Типы переменных и их логика
Переменные мы будем рассматривать в рамках визуального программирования, то есть метода работы с графическими объектами, без написания строчек кода, с так называемыми нодами. Это несложный способ понять, как работать с переменными без знания языка программирования. Мы коснемся лишь той части знаний, которая нужна для логики построения интерактивных историй.
Глобальные (Global) – переменные, которые доступны всей программе во всем проекте.
Локальные (Local) – переменные, которые доступны конкретной подпрограмме.
Мы остановимся лишь на первом варианте – на глобальных переменных, именно они актуальны для наших целей.
У каждой переменной есть своя функция и способ объявления, это как раз наша пресловутая «упаковка», о которой мы говорили чуть выше. Итак, мы рассмотрим три вида переменных.
● Логические булевы (Boolean)
● Строковые (String)
● Целочисленные (Integer)
Это переменная, которая несет в себе информацию о том, истинно или ложно то или иное свершение, событие, утверждение, данные. Мы оперируем понятиями правда (true) или ложь (false). Исходя из этой довольно простой программной логики, можно создавать весьма ветвистое сюжетное древо.
Пример
Давайте рассмотрим логическую (булеву) переменную на примере.
Дед Мороз положил в один подарочный мешочек плюшевого мишку, а в другой – куклу. Какой подарок получит Мария, мы можем запомнить и использовать дальше в истории.
Мы вводим переменную Bear и фиксируем данную информацию таким образом:
● true (да, правда) – это наличие медведя.
● false (нет, ложь) – это отсутствие медведя.
Соответственно, в тех моментах истории, где важна подаренная Дедом Морозом игрушка, мы пользуемся логикой переменной Bear, проверяя, есть ли у Марии медведь.
Это переменная, которая несет в себе информацию о том, сколько прибавляется к той или иной игровой сущности (или убавляется от нее). Мы оперируем числовыми понятиями, обычно используемыми для прокачки отношений, инвентаря, коллекций.
Давайте рассмотрим целочисленную переменную на примере.
У Деда Мороза был продуктивный рабочий день, он упаковал 10 подарков: либо плюшевых медведей, либо кукол.
Мы вводим глобальную переменную Gifts и переменные внутри нее – Bear и Doll.
Соответственно, далее сюжет зависит от того, что же в подарках и в каком количестве.
Строковая переменная (String Variable)
Это переменная, которая несет в себе данные о ключевом слове или нескольких, строке, последовательности символов. Она используется для ввода и вывода информации, для имен, псевдонимов персонажей и кличек питомцев, указывает названия локаций, предметов и других игровых сущностей.
Давайте рассмотрим строковую переменную на примере.
Мария получила от Деда Мороза в подарок мишку. Игрок может дать ему имя или оставить то, что предлагается по дефолту.
Для этого вводим строковую переменную Name. Далее мишка будет иметь то имя, которое ему задано.
Набор переменных (Variable Set)
В глобальных переменных можно выбрать набор переменных (Variable Set), отвечающих за какой-то общий параметр нашего проекта. Например, это могут быть Диалоги (Dialogues), куда мы вносим переменные по запоминанию ответов на диалоги на протяжении истории и, соответственно, выбор сюжетной ветки в зависимости от них. Или Инвентарь (Inventory), когда нам нужно ввести тот или иной предмет в процессе игры.