Как сделать игру за 2 дня в одиночку
- 12 декабря, 2014
- 29 комментариев
За два выходных, 6-7 декабря, я сделал с нуля игру на Ludum Dare. И теперь хочу рассказать о том, как это было. Но прежде предлагаю посмотреть на саму игру. Обязательно включите звук.
Что такое Ludum Dare?
Ludum Dare — это международный конкурс, на котором надо за ограниченное время сделать игру на заданную тему. Есть две категории участников: Jam и Compo. На Jam можно участвовать командой и использовать заготовленные ассеты или имеющиеся в открытом доступе. Срок на поджемить — 72 часа. Второй формат, Compo, требует, чтобы участник был один и всё создавал с нуля. Можно только использовать наработки кода, но в конце участия надо будет обязательно выложить исходники. Лимит времени в Compo — 48 часов. Подробнее правила можно почитать тут.
Несколько фактов:
* Конкурс проходит с 2002 года и является, пожалуй, самым популярным среди джемов по скоростной разработке. На последнем конкурсе было сделано 2538 игр.
* Маркус “Notch” Перссон, создатель “Minecraft”, когда покидал свою компанию, писал в своём прощальном письме: “I will leave Mojang and go back to doing Ludum Dares.”
* Лоукас Поуп, создатель “Papers, Please”, также часто участвует в конкурсе.
* В Steam можно найти 16 игр, которые начались на Ludum Dare.
* В конкурсе регулярно участвуют представители российской инди-сцены. Например, команда Molecats, Алексей “DiscoFish” Старовойт, Александр “Dyn” Павлов.
Узнав в середине ноября, что следующий Ludum Dare пройдет на выходных 6-7 декабря, я не смог устоять от участия. Это же шанс войти в международное indie-коммьюнити и попасть на глаза мэтрам.
Предварительная подготовка
Всегда считал, что правильная подготовка — это половина победы. Поэтому решил заранее ответить на те вопросы, которые встанут независимо от темы.
Движок
Самым первым вопросом, конечно же, был выбор движка. Тут много думать не пришлось. В первую очередь для такого конкурса важно иметь web-версию игры, чтобы конверсия посетителей в поигравших была максимальной. Мой выбор был Unity, так как с этим движком я уже порядочно знаком по работе над “Message Quest”. Можно ещё было выбрать флэш. Его возможностей хватает, чтобы сделать конкуретноспособную игру. В отличии от GameMaker, который не только не имеет внятной веб-версии, но и вынуждает разработчика выезжать на голой идее. Прилично выглядящих игр на этом движке можно пересчитать по пальцам одной руки. Хотя когда-то на этом движке я делал игру под Android.
Отдельно в ряды движков влез Unreal Engine 4, который за сутки до начала соревнования начал раздавать коды на 90-дневный триал (Unity о раздаче триала на Pro версию предупредило заранее). Думаю, что если бы был опыт создания игр в нем и умение моделить по-быстрому с бампами-спекулярами, то можно было бы выехать за счет картинки. Но все работы на UE4, что я нашел среди конкурсантов, имели клиентскую версию весом до 800Мб, ужасную графику и никакой геймплей. Думаю, Epic стоило подготовить участников, прежде чем раздавать ключи.
Арт и звук
Дальше я видел два крупных риска. В игре должна быть приличная графика, а я даже неприличную выдать не могу. Рисую ужасно. Может мог бы выпендриться с помощью фотографий, но это плохая идея для веб-игры — фотографии много весят, а значит игра будет грузиться дольше, чем у некоторых хватит терпения.
Также в игре должна быть музыка. Хотя обычно пользователи браузера предпочитают тишину, но раз тут на конкурсе у большинства игр есть музыка, то отсутствие музыки будет выделяться, как недостаток.
По арту я видел выход только в упрощенной стилизации. Вроде пиксель-арта, но не пиксель-арт, который поперек горла уже. Может, если бы делал во флэше, то нашел бы что-то в векторной графике, но выбор Unity подтолкнул меня к изучению low poly art, на который давно поглядываю. К тому же графика в лоу-поли арте легкая, то что надо для веб-версии.
Оказалось, что первые шаги не такие сложные, как я боялся. Сначала я пробовал собирать арт на тех примитивах, что были в Unity. Делал грубую сетку террейна, ставил и растягивал кубы и шары. Получалось так себе. Все равно террейн скрывал неровности и делал мягкие переходы между материалами.
Тогда, посоветовавшийсь со Станиславом Гайлюнасом, разработчиком Molecats, решил освоить Blender. Редактор быстрый, бесплатный и по нему есть видео-уроки лоу-поли арта. Мне достаточно было повторить все действия из урока, чтобы освоиться в новой тулзе и хоть что-то уметь делать. Так через час обучения я смог заменить террейн и деревья из примитивов на своё лоу-поли. Стало гораздо больше похоже на правду.
Следующим шагом стал вопрос создания музыки. Тут у меня ни опыта, ни образования. Поэтому я обратился с вопросом к сообществу. Мне ответил Евгений Винаков, посоветовав программы Musical Palette для создания midi-музыки по всей нотной науке и LMMS для наложения инструментов. Обе программы находятся в открытом доступе.
Musical Palette имеет встроенный туториал и систему подсказок. Уже через несколько минут после запуска программы у меня начало получаться что-то напоминающе музыку. С LMMS было ещё проще, так как мне требовалось лишь заменить инструменты и сохранить в стандартный звуковой формат. Unity не признает midi и правильно делает — слишком утомительно пищание и гудение стандартных “инструментов”. Хотя для веб-версий формат очень компактный.
Чтобы LMMS мог заменять инструменты, ему нужно подсунуть библиотеку инструментов в формате SoundFont. Интернет большой, так что найти что-нибудь стандартное не проблема. А вот зависание редактора при экспорте это проблема. К счастью, её удалось обойти с помощью экспорта через командную строку: lmms.exe <имя проекта> -o <имя файла для экспорта> -f <формат, например wav>. После этого результат загрузил в Audacity (тоже бесплатный) и пересохранить с нужным мне форматом и настройками качества.
Волновавшие меня технические вопросы я снял. Осталось только изучать победителей прошлых конкурсов, чтобы понять требуемую планку. Для себя я сформулировал её как набор требований:
Трактовка темы должна быть оригинальна и при этом проста для восприятия.
Игра должна быть целостной. Картинка, геймплей, звук — ничего не должно провисать.
Это должен быть законченный экспириенс. Игрок должен дойти до финала за 5-15 минут.
Основной геймплей должен быть фановым сам по себе, без мета-геймплея. Про это хорошо написано в “Искусство геймдизайна” как разница между играми и игрушками.
В последствии, отсматривая работы других участников, я видел, как участников губило отсутствие некоторых из этих пунктов. Игра красивая, но играть скучно. Трактовка интересная, но игра незавершенная. Играть весело, но графика никакая и промах темы.
День первый
Старт конкурса начинается с объявления темы, которое назначено на вечер пятницы, по моему местному времени — это 6 утра субботы. Смысла вставать в такую рань не было. Ну и что, что другие начнут работать раньше — они спать тоже раньше уйдут. А участвовать невыспанным в творческом конкурсе — это глупо. Поэтому проспал до 9 утра, посмотрел тему (Entire Game on One Screen) и продолжил валяться дальше, в полуспящем состоянии обдумывая тему.
Само собой, первым делом я отказался от идеи, что действие всей игры будет происходить на одном экране. Это слишком очевидно. К тому же это тема, которую нужно трактовать, а не правило, которое нужно соблюдать. Я начал перебирать идеи игр, которые уже давно созревали в голове, на предмет соответствия теме.
Первым совпадением была идея использовать новый UI в Unity 4.6, который позволяет делать интерфейсный экран висящим в 3D пространстве, а не прилепленным к камере. Другая тема, также рожденная этим обновлением движка, это многочисленные кнопки и прогресс-бары. Все мы знаем, как приятно смотреть на заполняющуюся полоску. Это у нас на подкорке головного мозга стремление завершать незавершенное.
Второй идеей было обязательное использование лоу-поли арта. Не зря же я ему учился.
Третьей была идея использовать синтезатор речи. Я раньше размышлял о том, что инди разработчики обычно не делают голосовую озвучку, потому что дорого и накладно. Но если все персонажи это роботы — озвучивать их с помощью синтезатора речи уместней некуда.
Всё это сложилось в простую историю в духе Portal. Есть плоский мир барчиков, где игрок должен совершать бессмысленные действия, потому что компьютер его об этом просит. А есть красивый 3D мир, куда персонаж может сбежать. Но счастье его продлится до тех пор, пока он не найдет мобильный телефон. Как бы мораль, что от власти экрана компьютера ещё можно сбежать, просто отойдя в сторону, то от власти экрана телефона нам уже никуда не деться.
Как только эта картина сложилась в голове, я приступил к работе. Целью первого дня было сделать полную геймплейную болванку, в которой присутствовал весь необходимый функционал и плейсхолдеры ключевых ассетов. То есть к концу дня версия должна быть в состоянии, что её можно стыдясь зарелизить. Второй же день посвятить облагораживанию версии. Заменить все плейсхолдеры, детализировать мир, написать музыку.
Первым делом я создал в Unity сцену из плоской площадки, FPS контроллера и летающего сanvas с кнопкой (button) и зеленым прогресс-баром (slider с отключенным hadle). При нажатии на кнопку прогресс-бар заполняется, а затем опустошается обратно. В любой момент можно нажать на кнопку, чтобы прервать опустошение и снова заполнить бар.
Затем сделал второй бар, красный, который заполняется, когда опустошается первый. При этом в первый бар влезает 100 условных единиц, а во второй 200. То есть надо два раза полностью заполнить и спустить зеленый барчик, чтобы заполнить красный.
После сделал экран апгрейда. Три кнопки на подложке. Подложка нужна была для того, чтобы двигать все три кнопки одним действием. По апгрейдам я решил, что первые два ускоряют процесс прокачки, а третий носит декоративный характер. То есть, хочет ли игрок быстрее достигать бессмысленного результата или предпочтет обустроить “рабочее место”. При этом первые варианты апгрейдов повторяются по кругу, а последний меняется, намекая на наличие уникальной прогрессии. Так что игрок должен рано или поздно взять последний вариант третьего апгрейда. Тут важный момент, что игрок должен дойти до этого сам, без подсказок.
Когда игрок берет последний особый апгрейд, начинается проверка, не нажал ли игрок кнопку S (шаг назад в WASD управлении). Если нажал, то включается FPS управление, ставится точка в центре экрана и немного меняется FOV.
Теперь задача — сделать локацию, по которой игрок может гулять. Тут не обошлось без классического планирования. Сначала я знал, что у меня есть отправная точка — место, где стоит компьютер. Задача — определить, что его окружает. Сразу уточню, что решил делать в generic сеттинге, чтобы сразу был эффект узнавания.
Задача схемы — определить, какие сущности будут и как они относительно друг друга расположены. Затем конкретизация на масштабной схеме.
Получив схему, где видно расположение гор, начинаю делать карту высот.
Раскрашиваю основные сущности: где можно ходить, где дороги, где ходить нельзя, где вода (тоже нельзя ходить).
Добавляю немного ёлок, чтобы был элемент для оценки маштаба. Мозг ведь знает средний размер ёлок, поэтому глядя на них может расчитать расстояния.
С этого момента можно начинать плейтестить. Цель первого плейтеста — оценить полученные масштабы и общие формы взглядом игрока.
Хотя я опасался, что локация выйдет маленькой и её надо будет достраивать, плейтесты сняли мои опасения. Размер получился в самый раз. Достаточно, чтобы побродить, но не слишком большой, чтобы не успеть его оформить.
На этом моменте я откладываю работу с картой и занимаюсь телефоном, своего рода целью, которую игрок должен будет найти, гуляя по локации. Телефон, как и компьютер, представляет собой простенькую модель и canvas на месте экрана.
С моделью телефона вышел странный баг. В те моменты, когда камера была направлена в сторону телефона, менялся цвет неба. Хотя модель и небо не имели общих материалов. Проблема решилась только путем удаления модели и изготовлением новой. Если кто-нибудь в курсе, из-за чего может быть такой баг, сообщите мне, пожалуйста.
Также с телефоном был другой косяк, вызванный моим личным неумением работать с новым UI. Добавляя текстовые поля, я менял им heigh и width, чтобы уменьшить их до требуемых размеров. В результате шрифт с кеглем всего в единицу был слишком большой. Позже выяснил, что уменьшать надо было используя scale.
Ещё с телефоном была задачка — сделать так, чтобы он оказывался развернут лицом к игроку, чтобы текст гарантировано был прочитан. Для этого в камеру игрока я добавил невидимый объект, координаты которого использовались для цели, в которую должен прилететь телефон при активации. Для плавной смены координат я использовал Vector3.Lerp. В результате телефон прилетал в центр экрана независимо от того, где стоит и куда смотрит игрок.
Настроил всё не сразу, поэтому, чтобы каждый раз не проигрывать всю стартовую последовательность по заполнению барчиков, сделал кнопку-чит, которая сразу включала режим хождения, а телефон положил рядом с местом старта.
День подошел к концу. Благодаря моим своевременным усилиям была готова версия, которая позволяла поиграть в заполнение барчика, отойти от компа, походить по простенькой локации, найти телефон и тем самым завершить игру.
День второй
Пришла пора озвучивать компьютер. Перебрав несколько синтезаторов, остановился на этом. Голос выбрал Lee, как не слишком дружелюбный. Результат синтеза получался слишком качественным, поэтому добавил эффект Duration Long, чтобы придать искусственные нотки.
После добавления первых фраз компьютера игра сильно изменилась. Во-первых, появилась голосовая озвучка как таковая, что большая редкость для таких маленьких игр. Во-вторых, появился персонаж. В-третьих, появилась обратная связь на действия игрока. Теперь заполнение барчиков стало не просто механическим занятием, а способом взаимодействия с персонажем.
В начале компьютер рассказывает игроку правила игры. Своего рода туториал, привычный нам по другим играм. Но все эти правила выводятся рядом на экран, как рабочая инструкция.
Затем компьютер научился комментировать выбор апгрейда. Если игрок выбирает ускоряющие апгрейды, то компьютер его хвалит. Если выбирает особые апгрейды, то осуждает выбор. С каждым разом осуждение всё более резкое. Но на последний выбор не реагирует — типа не замечает изменений. Но игрок видит настоящие правила и видит, что нужно сделать, чтобы изменить ситуацию — нарушить правило.
После того, как игрок отходит от компьютера, нужна фраза с просьбой вернуться. И фразы, которые компьютер будет издавать, если игрок решит вернуться. Игрок услышит, что компьютер получает удовольствие каждый раз, когда игрок нажимает на кнопку. Так сказать, объяснение мотивации компьютера в этом всём.
После озвучки занялся моделированием окружения. Проработкой ландшафта и добавлением новых объектов. К имеющейся ёлке добавились 2 вида деревьев, 2 вида кустов, 3 вида камней. Ёлки расставлял на одной части карты, группами по 2-4 штуки. Одну ёлку в группе делал заметно большой, а другие поменьше. Некоторые вытягивал по высоте, а затем уменьшал, чтобы выглядили как молодые деревья. Все деревья немного поворачивал в разные стороны, чтобы визуально не читалось паттернов.
Карта получалась насыщенной деталями, но без мяса. Поэтому решил добавить больших уникальных объектов. Сначала маяк, а затем башню. Поначалу хотел, чтобы на башню можно было залезть, но не удалось договориться с коллизией. Когда объект состоит из одного меша, то всё ок. Но, когда объект составной, то с коллизией начинаются фокусы — не тот размер и угол поворота. Времени на изучение проблемы не было, поэтому оставил башню как есть, незалезаемой. Попытки добавить на башню следы разрушений дали странный результат, который решил довести до состояния похожего на глаза и рот. Если игрок увидит в этой башне лицо, то сможет себе придумать историю про это.
Телефон, который игрок может найти, положил на специально замоделенный пенёк. Но я не хотел, чтобы к нему вела дорога. Кто прокладывает дороги к пенькам? Поэтому он расположился как бы невзначай рядом с дорогой, которая вела на поляну. За неимением фантазии, положил на поляну обычный костер. Получившуюся картинку затем использовал для как обложку игры. Чтобы показать, что в игре есть красоты, а также с намеком, что этот вид могут увидеть только те, кто пройдет мимо телефона.
К сожалению, я так и не придумал, что делать с маяком, башней и костром. Объекты есть, подойти к ним можно, а что дальше — непонятно. Самая толковая идея была — включать женский голос, который бы рассказывал историю про это место. Но никакие внятные истории в голову не лезли, к тому же на английском языке. Поэтому, раз не идёт мысля, то, значит, надо двигаться дальше.
Также сейчас понимаю, что желание сделать твист с переходом от унылого 2D к цветастому 3D это, конечно, хорошо. Но игра ведь начнется с унылого 2D, и многих это может отпугнуть. Только легкость геймплея и озвучка могут зацепить игрока.
Про написание музыки ничего путного сказать не могу. Просто елозил точками в Musical Palette, а затем перебирал инструменты на замену в LMMS. И настраивал в Unity, чтобы не только музыка компа затихала при отходе от него, но и включалась вторая музыкальная тема.
Также у телефона появился рингтон, чтобы лучше привлекал внимание. Звонящий телефон — это гораздо более стимулирующая к действиям штука, чем просто валяющийся кирпич.
Итак, последние настройки расположения игровой камеры, немного шаманства с цифрами апгрейдов, сборка версии и последнее тестирование. Всё окей. Заливаю версию с исходниками на свой сервер. Оформляю заявку. Всё, выкладываю. Игра сделана и сдана. Теперь ходить, смотреть другие игры, ставить им оценки и ждать 20 дней до конца голосования.