For Mari: Ретроспектива проекта

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

Речь в посте пойдет о том, что мы хотели сделать, что сделали, как делали, и что нужно было сделать. Так же будут всякие картинки и гифки с ранних билдов и прочие интересные и не очень факты. Ну что же, приступим.

Препродакшен

DT17lHT
Проект с который я делал в прошлый раз на Гаминаторе

Я участвовал в гаминаторе до этого два раза и оба раза поступал, как мне кажется, не совсем правильно, во время анонса конкурса, еще до озвучивания темы, я уже знал, что я примерно собираюсь делать, и лишь после открытия темы я корректировал (в первый раз мы с Димой корректировали) концепт игры так, чтобы он хотя б немного подходил под тему. У этого подхода свои плюсы, а именно быстрый старт, однако так как заранее с темой угадать довольно сложно, соответствие теме было притянуто за уши. В этот раз мы решили не торопиться, и после раскрытия темы мы дня три потратили только на то, чтобы решить, что мы вообще хотим делать. Это позволило придумать идею проекта, которая как удовлетворяла наши амбиции, так и полностью соответствовала теме конкурса, правда из-за того что мы профакапились со сроками мы не смогли в итоге в должной мере раскрыть тему, но об этом позже, однако же, мы не смогли раскрыть официально выбранную тему, но была и вторая «хуже чем живые мертвецы», и да я считаю, что неубиваемый призрак сестры хуже чем зомбарь, так что тема раскрыта! С другой стороны это по сути тоже живой мертвец… Но не будем уходить в дебри размышлений на данный счет.

FhUQuuU

Я знаю у многих людей бывают проблемы с тем, чтобы понять то, что они вообще хотят, так что «как мы выбирали тему?». Мы устроили небольшой брэйншторм. Я создал две таблички в гугл таблицах, в которых были такие поля «тема; описание проекта одним предложением; оценка идеи, предполагаемая сложность для программиста; предполагаемая сложность для художника». Затем мы оба излили поток сознания в каждую из таблиц и затем свели их вместе и провели оценку в столбцах друг друга. Идей было много, от тамагочи, где вместо зверька девушка, у которой периодически месячные и ОНА ЧУВСТВУЕТ БОЛЬ, до стэлс игры в духе Dishonored, но в которой нельзя просто так убивать.

Однако, идеи были либо слишком сложные, либо слишком дурацкие. Хотелось, что-то более приземленное, но в то же время бросающее вызов. Так ничего и не выбрав мы решили подумать еще, и мне пришла идея, а почему бы не сделать просто страшный симулятор ходьбы? У меня было два референса это P.T. и  RE7 beginning hour. Вы скажете «банально», да! Однако, прежде чем выдать что-то крутое свое, нужно научиться копировать что-то чужое. Обсудив все с другом мы все-таки остановились на этой идее и началось проектирование проекта. Были описаны основные геймплейные механики которые нужно было реализовать программисту, а я начал придумывать костяк истории и рисовать планы помещений.


Продакшен


Первый драфт помещения в Sketchup

Далее я буду говорить в основном про свою работу, я думаю, если вдруг Puffick захочет, он напишет свой пост, либо оставит дополнения в комментарии к посту. Первое с чем мне нужно было определиться, в чем мне делать дом. Так исторически сложилось, что мой основной софт по 3d моделированию это Autodesk 3ds max, но так как я хотел сначала набросать простенький драфт дома я искал, что-то более простое и быстрое, в результате вспомнил про sketchup, недавно как раз читал статью, где один из левелдизайнеров naughty dog рассказывал, что проектировал уровни именно там. Я довольно быстро освоился с программой и накидал драфт. Мы сразу условились 1 unity unit = 1 meter irl, я старался соблюдать все размеры и ГОСТы при проектировании помещений и это вылилось в первую проблему. Как говорится «то ли я  дурак, то ли лыжи не едут», но поместив помещение с правильными размерами в Unity мы осознали, что все в игре кажется чудовищно маленьким. Дверной проем размером 80−95 см ощущался чудовищно узким, коридоры в 2 метра шириной могли вызвать клаустрофобию. Я до сих пор не понимаю почему так. Я перепробовал разное, играл с FOV, опускал камеру ниже (в итоге в игре высота глаз на высоте 160 см), все бестолку. Кто-нибудь знает в чем дело? Дима считает, что 1 unity unit != 1 meter irl, хотя в этих ваших интернетах все говорят, что равно. Поэтому мы решили, что все в игре должно быть шире и выше, чем оно реально есть, чтобы это ощущалось более привычно, относительно других игр. (К слову, работая уже пару лет над VR проектом в unity, там таких проблем нет, видимо из-за особенностей VR камеры в юнити.)

Работа с sketchup вылилась еще в пару проблем, которые обусловлены скорее моей неопытностью в работе с этой программой, поэтому я решил все-таки использовать 3ds max и его архитектурными инструментами вкупе с правильной сеткой и привязками умудрился крайне быстро накидать драфт помещений, однако почему-то двери у меня отказывались автоматически вырезаться, в отличии от окон, что добавило немного геморроя в разработку.

Объемное освещение в HDRP

Изначально игра в итоге должна была получиться в разы технологичнее и следовательно красивее так как мы сразу решили пробовать работать с HD Render Pipeline. И это была ошибка, которая сожрала в итоге много времени. HDRP и впрямь очень классный, чего стоит только объемное освещение и объемный туман, не говоря уже об SSS, но unity preview package на то и unity preview package, чтобы через некоторое время разработки сказать нам «а не пошли бы вы все нах*й». Он работал отлично, а потом в какойто момент просто забаговал, и нам пришлось откатываться на обычный SSRP, мы могли конечно попробовать LWRP, но не решились экспериментировать. В чем собственно проблема? В том, что после выключения любого источника света в месте где он светил оставалось яркое пятно света, которое к тому же было дико пиксельным и необъяснимым образом жрало фпс, пока его уберешь с помощью краев экрана. Причем ладно, когда это происходило в окне scene, но когда это начало происходить в игре, это стало недопустимо. Пришлось откатываться назад. Проблема в том, что не получилось откатиться полностью, из-за чего сломалась reflection system и при сборке проекта высвечивалось окно, мол перейдите на hdrp и тогда проект будет собираться намного быстрее.


Тот самый баг, из-за которого пришлось откатываться

Мари при SSRP


Та же самая модель при использовании HDRP

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

Я поставил для себя основную задачу это смоделировать дом и весь его интерьер. Ранее я работал с небольшими интерьерами и моделил фасады зданий, но полной проектировкой не занимался. Еще во время предпродакшена я смотрел карты разных особняков из игр с целью понять как построить интересную архитектуру уровня, ибо реальные планы зданий казались мне слишком скучными, так например появился коридор вокруг зала, что не очень логично с точки зрения жилого помещения, однако в голове как кусок уровня смотрелось интересно. Не думаю, что в результате так и получилось, но это скорее проблема недоделанности самой игры. Сперва я замоделил болванку помещений в 3ds max, затем фасад дома и тут возникла проблема, я не знал сколько нужно материалов, чтоб это смотрелось нормально, и не жрало много ресурсов. В итоге из-за неопытности я поскупился и стены получились довольно мыльными.

Фасад здания в Substance Painter

В итоге по материалам расклад был такой

  • на стены дома
  • на крышу дома
  • водосток
  • лестницы
  • интерьер первый этаж
  • интерьер второй этаж
  • пол первый этаж
  • пол второй этаж
  • потолок

Если бы я переделывал, я бы сделал как минимум по два материала на полы и стены на каждый этаж, а лучше 4. Не скажу, что это на самом деле много бы сожрало, но детализация получилась бы лучше. Текстурю я все используя последнюю версию Substance Painter, и я надеялся сгладить это всё выведя текстуры дома в 8к, но видимо из-за нехватки оперативы (у меня 16gb), или из-за чего еще у меня программа просто вылетала, пришлось выводить 4к, что согласитесь на весь этаж мало.

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

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

Для начала я искал референсы. Референсами служили фотографии реальной мебели, каталоги интернет магазинов, скриншоты из других игры и ассеты на скетчфабе и турбосквиде. Если с фоточками все понятно, то последнее может вызвать вопросы. Я давно взял этот способ на практику, ведь часто просто фотографий для создания чего-либо бывает недостаточно, или нужные ракурсы бывает сложно найти, тогда я открываю sketchfub или turbosquid и ищу уже готовые модели на тему, на обоих ресурсах можно посмотреть нужный объект с разных сторон и обычно даже посмотреть сетку, что позволяет быстро и без мозготрепки смоделить что-то похожее, не теряя времени на поиск нужных картинок в гугле. Я не люблю брать чужие модели, особенно бесплатные, ибо часто они либо плохо оптимизированы, либо с косяками, однако я не брезгую брать бесплатные отсканенные модели. В таких моделях обычно миллионы полигонов и они непригодны для того чтобы использовать их в игре, однако всегда можно быстро сделать ретопологию, и все детали оригинальной модели просто запечь в нормали, результат получается классным. Тот же диван в игре был сделан именно так. Создавал я модели опять таки в 3ds max.

При большом количестве моделей очень важно правильно их именовать и разбивать на группы. Группировал я объекты не просто так, а чтобы объединить их в текстурные атласы, благодаря чему на все модели интерьера у меня в итоге получилось 7−8 материалов, на каждый атлас соответственно. Группировать модели лучше по смыслу, к примеру, светильники. Это выглядит примерно так: берем все светильники и помещаем на отдельный слой, слой лучше назвать что-то типа atlas_light, и все объекты должны так же называться используя имя атласа, например atlas_light_candelier. Материал лучше назвать также как и слой. В итоге, когда я перенес все в юнити, мне стало очень просто ориентироваться в большом количестве файлов, и вам советую. Нейминг занимает больше времени чем присвоение рандомных слов, но это в итоге экономит кучу времени.

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




Два атласа объектов

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

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

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

После того как игрок должен был лечь спать начинался бы второй акт. Герой просыпался бы посреди ночи и видел живую мари в дверном проеме. Как только герой бы заметил ее она бы убегала и ее нужно было бы найти. Найдя ее включалась бы катсцена, где герой разговаривает с ней, а после та с помощью морфинга и специально созданного шейдера в substance designer превращалась бы в духа и убивала героя. Который бы вновь просыпался в своей кровати. Затем нужно было б решить 4 загадки, каждая из которых раскрывала бы историю смерти мари. Подразумевалось, что в рамках одной загадки игрок должен был быть заперт в нескольких комнатах, чтобы ему не нужно было ходить по всему дому в поисках непонятно чего. А по мере прохождения по задумке призрак Мари появлялся бы все чаще и чаще и становился бы агрессивнее, что должно было все сильнее и сильнее нагнетать атмосферу, картину которой довершала бы динамически меняющаяся музыка.

К сожалению второй акт игры мы просто не успели сделать, за часов 6 до дедлайна у нас был готов только первый акт, и второй пришлось собирать в спешке, что в итоге вылилось в загадку «собери 5 листочков». Что не оч.

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


Создавая модель Мари я сразу понял, что нет смысла ее делать с нуля, ибо я потрачу очень много времени, поэтому собрал болванку в Fuse. Изначально в планах было показать две версии Мари, поэтому получившаяся на выходе из Fuse модель стала живой мари, а мне оставалось сделать «Мари призрака». Так как в планах было показывать ее превращение я задумал сделать несколько морф таргетов, которые поэтапно бы деформировали ее лицо, в чем мне успешно помог Zbrush с его функцией записывать изменения в отдельный слой. Затем выведя из Zbrush модели головы я продублировал оригинальные головы и сделал им conform относительно деформированных голов. Следующим большим этапом было текстурирование в Substance painter. В качестве базы я использовал оригинальные текстуры из Fuse, а сверху уже наносил всю криповую косметику и шрамы. Клевая, на мой взгляд, идея поступила от Димы, который предложил сделать ей тлеющие кончики волос, ведь Мари сгорела в машине. Их я сделал с помощью градиентной маски и карты свечения.

Стадии морфинга в Zbrush

Когда при конформе забыл отсоединить зубы в отдельный меш

Когда перебощил со значением морфинга

Рендер финальной версии Мари в iray


В качестве рига я использовал систему CAT, которая имеет удобную систему слоев. Каждую отдельную анимацию я наносил на отдельный слой, а корректировал ее в локальном adjustment слое. Мне захотелось попробовать сделать дрожание ее головы и тела, как в фильме лестница икара (в эпизоде в психбольнице) и как дрожала Лиза из P.T. Этого эффекта я достиг применив Noise на канал вращения в дополнительном слое, поиграв с настройками получилось очень даже.


Когда не подкорректировал Heatmap skining

Тест анимации

Анимации я делал в спешке, потому что время поджимало. Самым сложным было сделать убийство игрока, и сложность побольшей части была в том, что я до этого не делал катсценки в юнити, и не анимировал камеру. Для начала я выставил настройки камеры в 3ds max идентичными тем, что использовались у нас в игре. Затем разбил рабочий вьюпорт на два, в одном я непосредственно анимировал, а в другом смотрел на результат глазами игрока. Я не знаю как это правильно нужно было делать, но скорее всего, нужно было поместить камеру в отдельный контейнер и повернуть его на 180 перед началом анимирования, потому что в итоге камера смотрела в противоположную сторону от Мари, и уже с помощью кода пришлось это исправлять, что впрочем было быстро.


Анимация убийства игрока в 3ds max


Теперь о музыке, первые две небольшие композиции были написаны для одной из загадок которые не вошли в игру, это мелодия для музыкальной шкатулки: Музыкальная шкатулка
Расстроенная музыкальная шкатулка

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

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

Эмбиент

К слову о названии игры, мы долго перебирали их, в основном в голову шли шаблонные названия содержащие слова «боль», «страдания» и подобные, но в какой то момент я задумался над именем нашего центрового для истории персонажа и пришла ассоциация к композиции Бетховена Fur Elise. Из этой ассоциации в голове родилась история из детства героини, и название всего проекта. Фрагмент из не вошедшей в игру записки:


… Питер, как обычно, играл на пианино. Я подошла и спросила, что за чудесную мелодию он играет, он ответил «К Элизе». Я была возмущена: «Кто такая Элиза, и почему ты для нее играешь?». Брат рассмеялся и начал оправдываться, что не он ее написал, а какой-то древний композитор Бетховен. Меня такой ответ, разумеется, не устроил, я тоже хотела мелодию в честь себя. Я потребовала, чтобы эта мелодия называлась «К Мари», но была немного другой, не как у этой Элизы, но была не менее красивой…

for Mari

Было сложно за такой короткий промежуток времени придумать что-то, что вытекало бы из Fur Elise, я взял за основу «ми ре# ми ре# ми» и начал обыгрывать. Результат мне понравился, однако он весь построен на одной теме, что однообразно и конечно не очень хорошо.

Оставшиеся фоновые звуки, и эмбиент второго акта я взял из бесплатной аудио библиотеки (указана в титрах игры).


Мы работали над проектом меньше трех недель, причем у каждого из нас не всегда получалось уделять ему время каждый день. Работали скорее по модульному принципу, и все эти модули собирали воедино уже в последние дни. Мы из Новосибирска, поэтому у нас дедлайн был в 4 ночи воскресенья, что позволило встать утром в субботу и сидеть работать реально весь день и пол ночи. Часов 16 это конечно много, но так кажется лишь на первый взгляд, при таком большом проекте. Чтобы запечь более менее норм свет, нужно потратить ~полчаса, а запекание нужно делать после полной сборки локации, так что протестировать все и сидеть экспериментировать с запеканием было вообще не вариант. Поэтому мы запекли свет так, чтобы он более менее работал как во время первого акта, который происходит днем, так и второго, действие которого разворачивается ночью. Мы не могли использовать реалтаймовый свет, так как он расходует слишком много ресурсов, и профайлер выдавал более 30к батчей и соответствующие 15−25 фпс. При запеченном свете моя машина выдаёт стабильные 60+ фпс. На более слабых компьютерах конечно возможны просадки, ибо у нас не было возможности тестировать слабые машины, это бы решилось возможностью менять настройки графики, но мы не успели этим заняться. Последние часы можно было конечно дальше возится со светом, но более приоритетным было тестировать игру, благодаря чему было выявлено около четырех фатальных багов, из-за которых прохождение игры было невозможным.


Итог

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

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

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

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