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



Прототипирование


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

  • “Greybox”. Уровень собирается буквально из серых кубиков. Здесь вы закладываете фундамент всей последующей работы и выясняете размер уровня, требуемые графические и аудио ассеты, работаете над игровыми механиками и скриптовыми эвентами.
  • Whitebox”. Геометрия уровня уточняется, по возможности добавляются новые игровые механики, диалоги, заготовки синематиков, звук и так далее. Здесь же вы ещё лучше вытачиваете существующие игровые механики и скриптовые эвенты.
  • Графический пасс. К моменту работы над этим этапом вы должны быть убеждены, что на уровне интересно играть, и он всем вас устраивает. Заменять прототипную графику финальными ассетами долго и дорого. Любые изменения на этом этапе крайне нежелательны.
  • Завершающий пасс. Здесь наносятся финальные штрихи: добавляются летающие в небе птички, звуки костров и прочие приятные мелочи.
  • Полировка. Неизбежный этап, как правило происходящий уже после того, как работа над уровнем была завершена. Тут будут правки мелочей, пропущенных ранее, а также изменения по результатам новых плэйтестов и собранной статистики.

На картинке ниже вы можете видеть сравнение этапов “whitebox” и непосредственно финальной графики в игре “Mass Effect 2”.



Хочу ещё добавить, что слишком ранний переход к этапу работы с графикой — серьёзная ошибка. Вы можете легко обмануть себя и команду, сделав уровень с захватывающей графикой, но никакущим геймплеем, и всё потому, что визуально он выглядит хорошо. Посмотрите на это полутораминутное видео из мода для “Gears of War”, хорошо иллюстрирующее работу над геймплеем при отсутствии большей части графического контента.

На этапе прототипирования в здоровой команде или компании важно придерживаться правила “Failure is an Option”. Вы делаете прототип, оцениваете результат и, если он вас не устраивает, выбрасываете. Быстрые итерации позволяют эмоционально не привязываться к проделанной работы, поэтому процесс получается простым и приятным. На скриншоте ниже — кусочек прототипа уровня из инди игры, над которой я работаю.



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

Масштаб героя


Как можно раньше утвердите размер игрового персонажа. Я работаю в Maya в сантиметрах, и обычно устанавливаю усреднённый размер главного героя: 200см. в высоту, 100см. в ширину и 100см. в длину. Таким образом, создавая любой новый контент (куст, танк, дом), мы всегда знаем их размер относительно героя. Предполагается, что размер коллайдера персонажа будет иметь примерно такие же размеры, соответственно, проходы и двери в зданиях обязаны быть как минимум в полтора-два раза шире коллайдера.

Также если у вас несколько 3d-художников, настоятельно рекомендуется, чтобы все следовали единой системе измерений. Иными словами, если у одного человека размер героя выставлен в 200 сантимеров, а у другого — в 2 метра, то при импорте в движок, например, в Unity, вам скорее всего придётся дать моделям разную компенсацию масштаба (Scale Factor), так как для Unity 2 и 200 “майских” единиц измерения — это разные размеры. Ситуация усложняется, когда вы работаете с программами типа 3ds Max, где система координат оперирует абстрактными единицами измерения, поэтому придётся поэксперементировать в поисках общих размеров для всех пакетов трёхмерной графики, задействованных в вашей команде.

Масштаб окружения


Работа с масштабом окружения — крайне интересная тема. Следуя рассуждениям из предыдущего пункта, вам нужно работать в реальных масштабах, отталкиваясь от утверждённых 200см. И в то же самое время вам придётся лгать непросыхая. Соль в том, что временами объект реального размера ощущается слишком большим или слишком маленьким, и приходится корректировать его масштаб, пытаясь добиться достоверного, хоть и неправильного размера. Это хорошо прослеживается в играх со стилизованной графикой, например, “World of Warcraft”, где часто можно видеть объекты вроде каменных лестниц со ступеньками высотой чуть ли не с персонажа. Что интересно, в контексте стилизации это смотрится уместно и не вызывает вопросов, но если присмотреться — всё это чертовски странно.



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

Масштаб окружения как правило познаётся только в сравнении с человеком или очень знакомыми предметами. Предположим, что вы делается научно-фантастический шутер, действие которого происходит на странной чужой планете, где даже архитектура выглядит крайне необычно. Какой размер вон того… камня (или это растение?). Или какой размер у вот этого здания? Совсем не ясно. И только если раскидать по сцене фигурки людей, то вы сразу поймёте масштаб происходящего. В отдельных случаях сработают очень знакомые объекты: на картинке привычная форма автомобилей задаёт точку отсчёта для масштаба.



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



Скорость движения героя


Масштаб окружения не имеет смысла без аккуратно выверенной скорости передвижения героя. Чем быстрее герой передвигается, тем сильнее сжимается пространство. Хорошим примером является введение летающих ездовых животных в “World of Warcraft”. Прежде мир казался достаточно большим: требовалось время, чтобы добраться из одной точки в другую. С появлением воздушного транспорта это перестало быть проблемой, скорость перемещения героя радикально изменила размер мира при том, что сами локации какими были, такими и остались.

Очевидно, что такая скорость передвижения влияет и на геймплей: прохождение квестов, энкаунтеры с монстрами, охота за сокровищами и поиск дороги куда-либо (одно дело взбираться на гору, и другое — просто взлететь и приземлиться на вершину). От скорости так же зависит детализация окружения. Прикиньте, как бы вы детализировали гору, по которой герой-альпинист будет карабкаться на вершину, и гору, мимо которой герой-лётчик бы пролетел на самолёте.

Таким образом скорость передвижения важно утвердить как можно раньше на этапе прототпирования, в противном случае вас ждут постоянные переделки.

Время прохождения уровня


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

Как следствие, вы должны точно знать, сколько времени игрок может потратить на прохождение отдельного уровня, и на основе этих данных уже работать. В противном случае рано или поздно вам придётся перекраивать все уровни, подстраивая их под требования. В “Flappy Bird” с его мгновенными смертями игровая сессия может быть крайне короткой. В то же время открытый мир “Dragon Age: Inquisition” угрожает засосать вас на часы, причём всё действие будет происходить на одной локации.

Гладкие коллайдеры для гладкого геймплея


Предположим, у вас есть ряд мелких объектов типа коробок и бочек, каждый имеет свой коллайдер. Если герой побежит прямиком в группу объектов как на скриншоте ниже, он будет застревать и тупить ввиду хаотичности общей формы коллайдеров. Формально вы всё сделали правильно — коллайдеры корректно обыгрывают форму индивидуальных объектов. Однако представьте ситуацию в мобильной игре, где управление гораздо менее точное, чем на ПК или консоли. Игрок будет чаще втыкаться в объекты, и ему будет сложнее выбежать из окруживших его коллайдеров.

Возьмём ту же группу объектов и дадим им общий коллайдер. Теперь игрок не просто не будет втыкаться в углы, но контроллер персонажа автоматически будет обтекать группу объектов. Как результат — приятное плавное движение героя.



Для наглядности я сделал GIF с демонстрацией плавного движения вокруг обтекаемого коллайдера. Как всегда есть подводный камень. Общие коллайдеры не должны захватывать много пустого пространства. Невидимые стены жестко бьют по вовлечению. Если я пытаюсь отбежать от удара монстра и в ключевой момент втыкаюсь в невидимую стену, это сильно раздражает.

Не все коллайдеры одинаково полезны


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



Могу дать показательный пример из “Ведьмака”: вы видите группу коробок, с которых можно собрать добычу. Вы пытаетесь дотянуться до них, но Геральт вдруг начинается путаться в коллайдерах, втыкаться в невидимые стены, вертеться на месте и вообще вести себя как утопец на костре. Это напрочь ломает ощущение вовлечённости в игру, и вы невольно тянетесь за кружкой кофе, возвращаясь в реальность.

Occlusion Culling


Просто хочется напомнить об этой технике. Если коротко, она отключает рендер объектов, спрятанных за другими объектами. Unity, например, позволяет “запекать” Occlusion Culling, что оказывает существенное влияние на производительность. Причём как в лучшую, так и в худшую сторону, в зависимости от ситуации. Два примера:

  • В мобильной игре с Top-Down камерой (как в Diablo) активация этой функции экономит 2-4 Draw Calls (DC). В то же время к работе процессора добавляется 5мс. на обработку кадра. Совершенно не стоит того.
  • В ПК игре с First Person камерой, где действие происходит в узкой пещере, изначально имеется 450 DC. Активация Occlusion Culling уменьшает количество DC до 50 ценой тех же +5мс. Однозначно использовать нужно.

Параллакс и псевдо-3d


Любая 3d игра на экране монитора — это всё равно массив пикселей в 2d плоскости экрана, как ни крути (VR не в счёт). Но есть ряд трюков, позволяющих создать иллюзию трёхмерного пространства. В плане дизайна уровней, самым полезным инструментом будет осознанная разбивка картинки на передний, средний и дальний планы. Проще всего это реализуется в играх с Top-Down камерой а ля “Diablo” и “Path of Exile”, а также в сайдскроллерах (платформерах). Средним планом является ваш персонаж. Дальним может быть эпичный вид, как на следующем скриншоте, но чаще это просто отдалённые объекты.



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



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

  • Грязь на стекле дыхательной маски, как в “Метро 2033”.
  • Брызги крови прямо перед лицом, когда ради шкуры герой разделывает тушу зверя в “Far Cry”.
  • Руки и тапки персонажа, как у Faith в “Mirror’s Edge”.
  • Треснувшее стекло автомобиля во время вождения (”GTA”, “Far Cry”).
  • Пушка перед лицом, особенно в режиме оптического прицела (любой шутер).
  • Препятствие (бетонный блок, угол дома), за которым прячешься от противников. Игры специально поощряют такой геймплей. Например, в “Far Cry 4” можно прятаться за кустами, и противник вас видеть не будет.
  • Помехи в расположенном на экране нейроинтерфейсе, как в “Black Ops 3” и “Deux Ex: HR”.



Невидимые стены


Это достаточно специфичный случай, но стоит упоминания. В инди проекте, где я работаю, мы применили такую механику: когда вы входите в определённую зону, за спиной у вас возникает магическая стена, и впереди начинают появляться монстры. После гибели всех монстров заколдованные стены пропадают. Мы сделали это по аналогии с другими мобильными проектами типа “Dungeon Hunter”, а также по аналогии с “World of Warcraft”, где при битве с боссами у вас за спиной точно таким же образом перекрывается проход.

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

Есть ещё более непростительный подкласс невидимых стен — убивающие игрока границы уровня. Хуже, если разработчик строит геймплей вокруг этого ужаса. Яркий пример из “Destiny”: сундуки с сокровищами нередко ставятся возле самой границы уровня, да так, что часто неочевидно, где именно проходит граница. В итоге глупая смерть неизбежна, когда вы прыгаете на ровный камень в двух метрах под вами, а он в ответ мгновенно убивает героя. И да, это не смерть от падения в игре, где можно прыгать на 10 метров в высоту и приземляться на твёрдую землю без особых проблем.

Целевая платформа


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

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

Плэйтестинг


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

Тем не менее, главная задача — это проверить все свои гипотезы на практике, увидеть, где недотянули и где требуются правки. Как у любого творца, со временем глаз замыливается, и вы неизбежно допустите какую-нибудь ошибку или что-то недоглядите. Чем раньше будет адекватная обратная связь — тем лучше.

Аналитика


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



Причём даже если вы ещё не релизнулись, но имеете несколько тестеров, либо у вас демка доступна ограниченному количеству людей (например, “бэкеры” с Kickstarter’а), всё равно имеет смысл собирать и анализировать данные уже на этом этапе.

Полировка (polishing)


Старайтесь оставить чуть-чуть времени на полировку, то есть на мелкие правки и закрытие небольших дыр, до которых раньше не доходили руки по той или иной причине. Например, на один из моих недавних уровней стоит задача со списком из 29 пунктов. Каждый из них требует от 5 до 15 минут работы. Поборов эти проблемные места, вы переводите уровень с этапа полировки в статус “final” или “release candidate”. Проблемы, которые надо “полишить”, будут всплывать во время плэйтестинга и сбора статистики. Эффективнее не бежать сразу править каждую крошечную недоработку, а подготовить отдельный список, после чего поправить всё скопом. Помните, этот этап неизбежен, поэтому заранее оставьте на него время, даже если вы уверены, что сразу сделали всё круто, и полировать не придётся.

Заключение


На этом я завершаю эту статью, состоящую из двух частей. Если вы пропустили первую часть, то вот ссылочка. Также если вы интересуетесь освещением в Unity, вам может быть интересна моя недавняя статья тут же, на Хабре. Накопив больше опыта, вижу в статье некоторые неточности, но в целом она очень близка к реальности. Поэтому если вы только изучаете тему освещения в Unity, материал должен быть вам полезен.

Буду рад любым комментариям и предложениям. Кроме того, принимаю идеи для новых статей по левел-дизайну, а также освещению и постэффектам в Unity :) Спасибо за внимание!

Комментарии (19)


  1. Luxorix
    07.01.2016 09:34
    +3

    Спасибо за статьи, они реально полезны! Теперь вопрос по поводу ограничения карты. Я в своей 2D игре (типа Nuclear Throne) решил ограничить выход героя за пределы карты таким действом: когда герой подходит к краю уровня, то из-за края чуть появляется клешня большущего моба. Если герой подходит к краю еще ближе, то моб атакует его клешней, отнимая значительное количество hp. Что-то посоветуете или оставить как есть? Сеттинг: другая планета.


    1. DiscoDeer
      07.01.2016 09:58
      +1

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


      1. Luxorix
        07.01.2016 10:10
        +2

        Спасибо! Думаю проблему недоумения игрока решу небольшим сообщением в начале игры, типа: «За пределами зоны имеются очень сильные враждебные существа, которые боятся магнитного поля генератора, но с радостью полакомятся теми кто его покинет. Будь осторожен и не пытайся их убить!» Как нибудь так попробую обыграть.

        Добавил ваш сайт в закладки, рядом с сайтом Анатолия Шестова (aushestov.ru). Еще раз спасибо за вашу работу!


        1. DiscoDeer
          07.01.2016 10:29

          Ага, получается как в третьем «Ведьмаке». Там что-то вроде: «Вы входите в земли драконов, поверните, пока не поздно».

          Анатолий Шестов отличные материалы публикует, у него значительно больше опыта, так что его сайт непременно нужно читать, это да :)


          1. SpiderMan
            16.01.2016 18:07

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


        1. engine9
          08.01.2016 11:22

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


          1. Luxorix
            08.01.2016 12:56

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


            1. engine9
              08.01.2016 15:03

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


              1. Luxorix
                08.01.2016 15:20

                Про линию интересная идея. Спасибо! Только сделаю, что вдоль края кости валяются)


    1. Aquahawk
      07.01.2016 10:02

      оставляйте, прикольно.


    1. NElias
      12.01.2016 13:18

      Сэр, на вас объявлена охота! Посмотрите эту игру, там похожая механика.


      1. Luxorix
        12.01.2016 14:18

        О чем вы?


        1. NElias
          12.01.2016 14:22

          В игре «Сэр, на вас объявлена охота!» такая же механика как у вас, посмотрите детали реализации там.


  1. Oxoron
    07.01.2016 13:51

    Невидимые стены… дешёвый и ленивый способ… результат такой же дешёвый… всё лучше невидимых стен.

    Создатели первой «Готики», вписавшие свою стену в бэк, с Вами категорически не согласны (впрочем, это скорее одно из тех исключений, из-за которых «Готика» и считается исключительной игрой). Плюс, я как-то давно видел лабиринт с прозрачными стенами, очень даже неплохая игра была. А вот ВНЕЗАПНО убивающие стены — зло в чистом виде.


    1. DiscoDeer
      07.01.2016 17:37

      Конечно, исключения всегда есть. Кроме того, вписанные в бэкграунд стены — это немного не то, о чём я говорил. Я имел ввиду скорее ситуацию, когда вы находитесь в открытом поле, начинаете бежать «не туда» (по мнению игры) и на ровном месте втыкаетесь либо в невидимую стену, либо вам просто-напросто говорят вернуться назад в течение нескольких секунд, в противном случае персонажа либо телепортируют («Ведьмак»), либо убивают («Destiny»).


  1. Mercury13
    07.01.2016 19:34
    +1

    Polishing я бы перевёл как «доводка».
    Сейчас я как хобби-проект пишу компьютеризацию известной настольной игры — так сразу же думаю, как научить игрока играть.


  1. Treidge
    07.01.2016 22:10

    Хороший очерк, дает общее представление о некоторых идеях левел-дизайна.


  1. engine9
    08.01.2016 11:20

    Спаибо, отличные статьи. Уже применил знания на живом проекте.


  1. SpiderMan
    16.01.2016 18:18

    Ваши статьи можно заносить в учебник по гейм-дизайну. Спасибо

    А теперь можно посоветуюсь с вами? У меня мобильная 2D игра, совсем не похожа на Crossy Road, но игровая физика в общем-то как брат или сестра этой игры. Игра вертикальная, белки убегают по дереву вверх. Задача: заставить игрока бежать вверх не останавливаясь. Был вариант догоняющего огня, но теперь за белками гонятся пауки. Текущая реализация такая, что камера сопровождает белок, а пауки движутся снизу с одинаковой скоростью. Когда они догоняют белок, то их становится видно. И тут я вижу два серьезных недостатка:
    1) Игрок не видит пауков постоянно, а значит расслабляется когда их нет. А когда пауки появляются в кадре, то они уже слишком близко (опасно) и их все равно плохо видно (пальцы игрока перекрывают частично пауков).
    2) Игрок может оторваться от пауков очень сильно и потом расслабиться. Или не расслабляться, но всегда идти впереди, не чувствуя дыхания пауков в затылок. Еще плохо и то, что не видна как близко пауки (вводить еще один индиктор — не вариант, уже есть scores и кнопочка выхода в меню.

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

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

    Может подскажете что-то? Спасибо