Gamedec демонстрирует то, как включить сложные ветвления с помощью Unreal Engine.


Gamedec - это однопользовательская изометрическая ролевая игра в стиле киберпанк без боевых действий. Вы Gamedec - частный детектив, который раскрывает преступления в виртуальных мирах. Решения, которые вы принимаете, изменят черты вашего персонажа и повлияют на ход игры, но кейсы полны дилемм и редко бывают однозначными. Вы - сумма вашего выбора.

Gamedec - это игра, основанная на множестве обширных и сложных диалогов и ветвей принятия решений. Одно решение может открыть способ решения проблемы, но также может заблокировать другое. Для создания такой сложной игры требуются специальные инструменты. В сочетании с Unreal Engine мы используем Articy - программное обеспечение, объединяющее написание игр, планирование и управление контентом в одном согласованном визуальном инструменте.



Один из примеров ветвления в Gamedec.

Задача

Чтобы сделать мир Gamedec более ярким, дизайнеры должны иметь возможность влиять на него не только через диалоги, но и через движения NPC, изменения в мире, атмосферную музыку и многое другое. Игроку нужно видеть, что он действительно взаимодействует с игрой, а не просто щелкает сквозь стены текста.

Вначале команде Gamedec пришлось расколоть крепкий орешек. Чтобы влиять на мир на основе выбора игроков, им приходилось полагаться на уникальную последовательность, представляющую объект Articy, называемый техническим именем.

У этого подхода есть несколько недостатков. Глядя на Blueprint уровня с первого взгляда, мы не знаем, какой фрагмент диалога представлен определенным техническим именем, где он вызывается и что делает. Мы должны открыть Articy, найти узел с этим техническим названием и проанализировать ветку, чтобы понять, что должно произойти в игре. Кроме того, члены команды, которые работают только с Articy, не имеют четкой информации о том, какой узел запускает действие в Unreal Engine.


Наш первый подход к выполнению событий в ответ на выбор диалогового окна был основан на таком переключателе.



Один из примеров ветвления в Gamedec.

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

Решение

Для решения этих проблем Articy предлагает очень удобный механизм, который позволяет нам выполнять наши функции. Вставка вызова функции в блок инструкций устраняет проблемы, с которыми команде пришлось столкнуться, упомянутые выше.



Решение проблемы - блок инструкций. Первое преимущество такой функции заключается в том, что разработчик точно знает, когда выполняется заданное действие. Стоит отметить, что изменение местоположения блока инструкций не требует изменений в Unreal Engine; мы вызываем функцию, которая уже была определена в другом месте диалога.

Использование собственных функций также дает вам значительное преимущество. Программисту геймплея больше не нужно определять даже самое маленькое действие на уровне Blueprint. Мы создали множество функций, упрощающих управление игрой с уровня Articy при создании диалога.

Например, если мы хотим, чтобы NPC, с которым мы разговариваем, направил нас в конкретное место, о котором мы говорим, мы можем сделать это с помощью двух инструкций GoTo и FollowBy, передав им необходимые параметры, такие как местоположение, скорость ходьбы и т. д.



Эта кат-сцена вызывается выбором диалога.

РеализацияКонечно, Артиси не знает, где находится что-то вроде Locations_TheaterDoor и какой NPC - Characters_Admin . Мы должны определить это в Unreal Engine. Для этого мы создаем компонент, который позволяет нам зарегистрировать актера в системе.



Мы зарегистрировали дверь нашего театра, показанную выше, как Locations_TheaterDoor.

Система проста. Когда уровень запускается, все акторы с этим компонентом регистрируются в объекте, который хранит эти данные в словарях. Ключ - это заданный идентификатор, а значение - ссылка на актера.

Хорошо, а как выглядит привязка Articy и UE4? А как работают эти функции? Прежде всего, если мы поместим нашу функцию в блок инструкций, плагин, импортирующий данные из Articy в Unreal Engine, создаст интерфейс: UserMethodProvider, который содержит определения всех функций, используемых в Articy.


Этот листинг представляет собой фрагмент сгенерированного интерфейса.


Чтобы гарантировать, что сгенерированный интерфейс всегда будет содержать набор доступных пользовательских функций, мы создали раздел потока Articy, содержащий все определенные инструкции с их параметрами. Он никогда не выполняется, а идет в экспорт, поэтому мы можем быть уверены, что все наши функции будут в этом интерфейсе, даже если они нигде не используются. Это позволяет нам избежать проблем в дальнейшем. Это что-то вроде объявления API для Unreal Engine.



Вот фрагмент потока, содержащий набор всех доступных функций.


Плагин Articy для Unreal Engine содержит класс UAArticyFlowPlayer . Он перемещается по дереву диалогов и позволяет исследовать ветви диалога. В этом классе вы найдете функцию для проверки того, реализует ли субъект или какой-либо из компонентов описанный выше интерфейс. В общем то все. Теперь мы можем создать компонент, реализующий интерфейс UserMethodProvider, чтобы определить поведение наших функций.

В GamedecВ этом случае у нас возникло соблазн разбить интерфейс на более мелкие, поскольку он начал сильно разрастаться под давлением последовательных добавлений функций. Мы создали меньшие интерфейсы, содержащие только группу функций. Затем мы создали фасад, который реализует базовый интерфейс и делегирует выполнение функций соответствующим объектам. Это решение позволяет нам разбить систему на более мелкие фрагменты и сохранить логическую целостность целого.

Кроме того, мы можем зарегистрировать несколько классов для ответа на определенное событие. Проблема, с которой мы столкнулись, заключалась в многократном выполнении одной и той же функции. Это связано со спецификой поперечного действия дерева. FlowPlayer анализирует все возможные пути перед запуском конкретного диалогового блока - это связано с условиями, которые необходимо выполнить, чтобы определить, можем ли мы войти в конкретную ветвь и, таким образом, отобразить список доступных параметров.

Однако здесь помогает особенность Articy под названием Shadow Mode. В настоящий момент, когда Articy анализирует дерево, чтобы проверить, какие ветви доступны, он делает это в этом специальном (теневом) режиме, который не влияет на какие-либо переменные и игровой процесс. Когда мы проходим через данный узел, мы не находимся в режиме тени, и только тогда наши функции должны выполняться. Это то, на что мы действительно должны обратить внимание.



Проблемы

Использование ваших собственных функций в Articy также связано с определенной проблемой - Articy "из коробки" не дает нам никакого механизма для проверки синтаксиса собственных функций. У дизайнера нет информации о том, существует ли используемая функция, а переданные ей параметры согласуются с реализацией в Unreal Engine. Какое-то время это была своего рода проблема.

Были ситуации, когда в течение нескольких часов мы анализировали, какое изменение в Articy нарушает ежедневную сборку.

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

Пример проблемной инструкции:

CallEvent("OpenHiddenRoom")// Open the secret room

Мы не смогли быстро найти эту проблему, проанализировав логи, потому что ошибка указывала совсем в другом месте. В результате нам пришлось кропотливо анализировать все внесенные изменения и комментировать их, чтобы найти ошибку. Когда мы забыли добавить точку с запятой в конце последней функции и добавили блок комментариев, а затем добавили плагин для импорта данных из Articy, в движке появилась ошибка. Он изменил тип возвращаемого значения с void на object, и в результате мы получили ошибку компиляции.

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

Однако Articy позволяет создавать собственные плагины. Таким образом, мы создали плагин, который проанализировал все блоки инструкций, чтобы найти функции, а затем проверил, совместимы ли они с их определением. Мы установили этот плагин для каждого члена команды, которая активно работала с Articy, и с этого момента эта проблема не возникала в наших ежедневных сборках.




Вывод

При разработке игр важно каждое решение, например, что вы выбираете для своего программного обеспечения, набора инструментов и архитектуры программного обеспечения. Выбор Articy в качестве инструмента для создания взаимодействий и его расширения с помощью пользовательских функций и нашего собственного плагина был для нас правильным выбором. Возможность создавать виджеты утилит редактора для Unreal Engine позволила нам быстро разработать инструменты для отладки взаимодействия между Articy и UE4, что было критически важно для разработки нашей игры. Своевременное принятие решений об упрощении работы принесло команде ощутимые выгоды в виде более быстрой итерации взаимодействий, а также быстрого прототипирования, которое позволило нам вести игрока без привлечения программистов.

Возможность быстро создать прототип игры с использованием Blueprints в сочетании с управлением ходом игрового процесса непосредственно из диалогов, созданных в Articy, сделала его отличным дуэтом для создания игры, основанной на выборе, такой как Gamedec . Это позволяет дизайнеру быстро проверить, правильно ли представлены какие-либо изменения, внесенные в проект.

С точки зрения дизайна, квест-дизайнер не должен привлекать остальную команду, например программистов или графических дизайнеров, для создания скелета взаимодействия в Unreal Engine. Они могут делать это самостоятельно, экспериментировать с этим и повторять. Это фантастика и экономит много времени на общение. Articy в сочетании с Unreal Engine предоставляет множество механизмов и инструментов, которые позволяют нам наилучшим образом адаптировать их к нашим потребностям для разработки Gamedec .

Комментарии