Системы, создающие экосистемы: Эмерджентный игровой дизайн

EDUARDO ORIZ / UNITY TECHNOLOGIESSenior Content Marketing Manager
Dec 7, 2021|10 Мин
Системы, создающие экосистемы: Эмерджентный игровой дизайн
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

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

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

Мы создали новую электронную книгу "The Unity game designer playbook" для гейм-дизайнеров, которые хотят узнать, как создавать прототипы, разрабатывать и тестировать геймплей в Unity. Новички и опытные гейм-дизайнеры могут воспользоваться этим руководством, когда начнут добавлять навыки работы с Unity в свой профиль.

Кристо Ноббс, старший технический гейм-дизайнер, специализирующийся на разработке системных игр и Unity (C#), участвовал в написании электронной книги. В этой записи в блоге, первой из серии статей для дизайнеров игр, он развивает некоторые советы и примеры по проектированию систем, которые он привел в электронной книге.

Тестовый проект
Изображение из тестового проекта, иллюстрирующее систему распространения огня и возможный хаос, который может возникнуть в результате.

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

Комбинируя такие системы, вы можете создавать уникальные экосистемы, реагирующие на действия игрока и сбалансированные с помощью "рычагов дизайна" (в отличие от скрытых, жестко закодированных значений). Эти рычаги используются для манипулирования данными, что приводит к системной игре.

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

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

Модульные системы могут создать интересный геймплей

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

Кислород в комплект не входит
Кислород в комплект не входит Klei

Один из примеров цепной реакции - игра Oxygen Not Included, где цель основного цикла - сбалансировать ряд систем, чтобы достичь состояния симбиотической утопии и продолжать развиваться. Еще один пример из игры Divinity Original Sin 2 от Larian Studios: мобы, которые взрываются, чтобы атаковать, больше не могут этого делать, если игрок их намочит, что облегчает бой. Или же игрок может поджечь землю, чтобы защититься от мобов, когда те побегут на него.

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

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

Рычаги проектирования

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

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

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

Простая схема дизайна игрового процесса
Простой дизайн игрового процесса

Эта система также может быть использована для создания полноценного пулевого шторма с отличными дропами и различными типами патронов со своими свойствами. Добавив дополнительные рычаги, такие как таймаут для респауна, вы сможете расширить систему еще больше.

Система создания оружия в игре "Побег из Таркова

Побег из Таркова от Battlestate Games - еще один хороший пример системного дизайна игр в Unity. В игре есть система создания оружия с собственным набором данных, как показано на изображении ниже. Этот набор данных влияет на характеристики оружия и общий игровой процесс, подобно здоровью игрока. Если игрок получил перелом конечности или заболевание, его оружием становится сложнее пользоваться, в то время как здоровый игрок лучше контролирует оружие.

Оружие из фильма "Побег из Таркова
Система создания оружия в игре "Побег из Таркова

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

Также имеется широкий выбор типов патронов, обладающих различными свойствами, и брони. Тип боеприпасов и брони противника определяет, в какое место его тела нужно выстрелить, чтобы нанести наибольший урон, создавая метагейм. Эти системы, каждая со своим набором визуальных подсказок, сбалансированы, чтобы создать "суть" геймплея, которую искали их дизайнеры.

Побег из Таркова
Системы Escape from Tarkov созданы для достижения реализма.
Объекты со сценариями как рычаги проектирования

Одним из способов настройки рычагов дизайна в Unity являются объекты ScriptableObjects. Они могут использоваться в качестве контейнеров данных, которые сохраняются как активы и на которые можно ссылаться в сценариях, не создавая зависимостей от других объектов в Сцене.

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

Например, при создании прототипа персонажа вы можете изменить его восприятие, заменив актив ScriptableObject на актив с другим набором значений. Это потенциальный путь к созданию прототипов баффов и дебаффов или подключению выбора персонажа к профилям.

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

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

Панели, которые можно настроить в Unity, скриншот
1) Атрибуты диапазона, всплывающей подсказки и заголовка. Инспекторы могут быть настроены в соответствии с вашими требованиями к дизайну. 2) Пользовательский инспектор, созданный с помощью Odin и доступный в Asset Store 3) Данные, сохраненные в ScriptableObjects, которые могут служить для создания различных наборов данных или профилей, в данном случае - различных специальных атак

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

Давайте рассмотрим пример, когда игроку необходимо оставаться на территории, чтобы выжить, как, например, в игре Don't Starve от студии Klei. Игрок может оставаться возле костра, чтобы предотвратить нападение врага. Костер также можно использовать для приготовления пищи и согревания игроков. Однако если огонь окажется слишком близко к игроку, еде или легковоспламеняющимся предметам, он сожжет их.

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

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

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

Игрок может использовать эту древесину для создания предметов, например, причудливого деревянного стула, или развести небольшой костер рядом с прудом, чтобы согреться и обсохнуть после купания. Но что будет, если дать игроку возможность разжечь костер?

Система воспламенения дерева не сложна, но если что-то горит, оно излучает тепло в радиусе, и если это тепло превышает предельное значение для соседнего деревянного предмета или дерева, они тоже загорятся (простое распространение). Так игрок, разжигая костер, поджег свой красивый деревянный стул. Теперь игроку нужно взять стул и бросить его в воду, чтобы потушить огонь, но пока он это делает, костер поджигает ближайшее дерево, и вот уже у вас на руках лесной пожар.

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

В данном примере в Unity вы можете создавать эмерджентные возможности, храня рычаги дизайна в объекте ScriptableObject, помещенном на все, что должно загореться. Для начала давайте рассмотрим дерево в мире, где мертвое дерево уже горит рядом с кромкой воды, но наклоняется к ней, а нашему игроку нужно согреться.

В этом примере на дереве находится объект ScriptableObject с различными значениями.

Сценарий объекта
Сценарий объекта
Код для скриптового объекта
Код для скриптового объекта

Давайте рассмотрим эти значения более подробно:

  • Температура по умолчанию: Значение-заполнитель, если ничего не нужно наследовать от глобального состояния. Если температура будет глобально высокой или низкой, мы можем повлиять на работу всей системы, так как повышение температуры может привести к возникновению лесного пожара, если предположить, что все деревья используют систему распространения огня.
  • Текущая температура: Температура предмета при нагревании или охлаждении, которая определяет, сгорел предмет или нет (если текущее значение температуры превышает значение сопротивления)
  • Температура горения: Температура, которую должен набрать предмет, чтобы загореться
  • Скорость нагрева: Как быстро нагревается предмет, находясь в радиусе действия другого источника тепла
  • Скорость перезарядки: Как быстро изделие возвращается к своей "ненагретой" температуре, что можно назвать сохранением или тепловым качеством, если название рычага дизайна является самоописанием
  • Скорость сгорания: Как быстро изделие сгорит со временем
  • Топливо: Сколько топлива у предмета при горении
  • Тепловая прочность: Сила тепла в радиусе
  • Радиус нагрева: Достижение или распространение тепла

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

Прототипом послужили активы из магазина активов
Прототипом послужили активы из магазина активов

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

Этот пример системы распространения огня дает возможность получить одинаковый результат, изменяя топливо, скорость горения и силу нагрева. И вы можете создавать новые результаты, например, заменив "топливо" на "здоровье", чтобы получить постоянный диапазон для управления падением дерева без потери функциональности. Когда дерево достигнет низкого уровня здоровья, у него будет высокая вероятность падения. Теперь, когда горящее дерево достигает низкого уровня здоровья, оно может упасть, создавая абсолютный хаос, если игрок не управляет им в зоне с горючими объектами.

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

Скриптовый объект в Unity
Актив данных объекта со сценарием

Вы можете создать конфигурацию распространения огня с высокой волатильностью, уменьшив порог горения и увеличив скорость нагрева, чтобы объекты сгорали быстрее. Увеличьте радиус, чтобы получить более быстрое и неконтролируемое распространение. Скорость нагрева ограничена от 0 до 50, чтобы обеспечить детализацию; Сила нагрева может быть использована для умножения этого значения, но вы хотите, чтобы оно находилось в разумном диапазоне. Сила нагрева 4 увеличивает скорость нагрева до диапазона от 0 до 200, что является чрезмерным и приведет к лесному пожару за считанные секунды. Поскольку игрок не успевает среагировать, чтобы контролировать пламя, это не лучший игровой опыт.

Настройка скриптового объекта
Настройка скриптового объекта

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

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

Очень запоминающийся момент Don't Starve от Klei, когда вспыхивает лесной пожар.
Очень запоминающийся момент Don't Starve от Klei, когда вспыхивает лесной пожар.

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

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

Получите еще больше советов, инструкций и вдохновения для разработки и улучшения игрового процесса в Unity в нашей новой электронной книге, доступной бесплатно.