Дневник разработки игры «Numbers: A Chain Match Game»

Дневник разработки игры «Numbers: A Chain Match Game»

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

Начиналось все с концепции:

Игра логическая, геймплей не привязан к времени, максимум к ходам, без необходимости в скорости реакции, с повышающейся сложностью, рандомно генерируемая, для игры 1 рукой в метро. Делаем поле 9*9 с рандомными цифрами 1-9, надо соединять цифры в порядке возрастания, типа 1_2_3 при соединении они суммируются, дают столько очков и пропадают, на их месте появляются новые рандомные цифры, почти как 3 в ряд, но только цифры и только по порядку. Можно делать игровое поле разных размеров.

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

Дневник разработки игры «Numbers: A Chain Match Game»

Как все это работает?

Весь игровой процесс происходит в 1 сцене, в независимости от режима и размера поля, мне показалось так будет проще чем делать 10 сцен с локациями под каждый режим и передавать данные между ними. Поле представлено матрицей размером 5*5, 7*7 или 9*9. Когда мы жмем на цифру то запоминаем ее значение и ставим ее как начальную точку отсчета последовательности, далее при свайпе (не отпуская палец от экрана) мы кидаем рейкаст каждый кадр по положению пальца на экране. Если под пальцем нужная цифра (ее тег больше на 1 чем первой выбранной цифры), то сохраняем ее в последовательность и продолжаем кидать рейкасты уже с ее позиции и сверяя с ее тегом.

Это повторяется пока мы не отпустим палец от экрана или не соберем всю последовательность 1-9, дальше начинается магия под названием «конец хода».

Конец хода запускает функции в таком порядке:

  • Подсчет очков и урона. Очки считаем по формуле количество собранных цифр * ширину игрового поля * и еще раз на ширину. Так получается, что собирать более длинные последовательности «выгоднее» по очкам, также как и играть на поле большего размера. Возможно эту формулу нужно будет балансить еще.
  • Проверка на конец уровня.
  • Включение анимаций удаления цифр.
  • Удаление собранных цифр с поля.
  • Заполнение пустых ячеек цифрами, которые были выше в этом столбце, как водопад.
  • Заполняем пустые ячейки новыми цифрами. Для этого проверяем поле на количество всех цифр, возвращаем массив с цифрами, которых согласно правил мало на поле. Из этого массива рандомно выбираем одну цифру и заполняем пустую ячейку. Повторяем проверку и заполнение пока поле не будет полным.
  • Сохраняем поле.
  • При новом тапе на экран проверяем есть ли возможные ходы, и если нет — конец игры. Ходов нет, когда на поле не осталось четных или нечетных цифр полностью, например, для поля 5*5 концом игры будет наличие на поле только цифр 1, 3, 5 или 2, 4.

Кому интересно, в комментариях могу рассказать подробнее про любую функцию.

А дальше?

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

Дневник разработки игры «Numbers: A Chain Match Game»

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

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

Что сейчас сделано в игре, и почему это бета версия?

Для начала пару скриншотов текущей версии игры для понимания написанного ниже:

Все в игре делаю сам, включая графику, анимации, звуки и музыку, мой опыт достаточно маленький. Это первый мой опыт работы с Unity, а кодил на С# по минимуму пару лет, ничего сложнее пицца-калькулятора не делал. Опыта в рисовании векторной или пиксельной графики тоже минимум, остановился на пиксельной, казалось, что легче — я ошибался, уместить все детали в 32 или 64 пикселя достаточно сложно не имея опыта и главное практики. Ну и с музыкой вообще беда, не понимаю ничего, меня хватило на звуки, а музыку сделал чиптюн генератором. Ниже собрал чеклист что сделано / не сделано, для оценки текущего состояния проекта.

--- Общее.

Сделано:

  • Локализация на три языка, русский, английский, украинский, думаю к релизу будут основные европейские языки, текста в игре все равно мало.
  • Локальное сохранение прогресса для двух режимов одновременно, с кодированием данных от мамкиных хакеров.
  • Подключены Google Play сервисы, с достижениями, рейтингами игроков и облачным сохранением.
  • Самое любимое в любом сообществе — наличие рекламы. Да, она есть, но так как меня она тоже напрягает (особенно внезапный баннер), то ее здесь минимум, и она не мешает игровому процессу. Добавлен 1 баннер внизу экрана, только во время паузы, 1 видео реклама за обновление игрового поля (по желанию), видео реклама +3 к подсказкам, доступно неограниченное количество раз (по желанию).
  • Добавлены достижения, нарисованы и добавлены иконки для каждого.
  • Добавил firebase для сбора статистики, прописал кастомные события такие как конец уровня, теперь понятно на каком уровне игрок закончил игру и по какой причине, будь то рестарт или проигрыш.

Надо еще сделать:

По пункту общее все готово к релизу, и думаю ничего нового не появится.

--- Геймплей.

Сделано:

  • Два режима игры, обычный и с лимитом времени.
  • Три разных размера поля 5, 7 и 9 клеток.
  • Смена уровней, смена боссов и скина главного персонажа.
  • При смене уровня перемешивание текущего поля, не добавляя новые цифры.
  • Атаки и оружие персонажа и боссов.
  • Функция поиска хода, 3 попытки. Оказалась самым сложным решением в плане кода как для новичка. Этот метод ищет все возможные последовательности для каждой цифры на поле. Сначала в большую сторону от цифры, потом в меньшую. Образно для цифры 3 сначала находим 4 и 5, а потом 2 и 1. Все найденные последовательности сравниваются по длине и среди самых длинных рандомно выбирается одна, которая и будет показана игроку. Дополнительные попытки доступны за просмотр рекламы, +3 за просмотр.
  • Функция обновления игрового поля, когда закончились возможные ходы. Такой себе софт рестарт игры, но с сохранением всего прогресса. Доступно 1 раз за игру, и при желании только 1 раз за рекламу.
  • Добавлено обучение в начале игры или по кнопке из паузы. Реализовано самым простым способом, с помощью текстовых блоков, слоев и порядке объектов на слое. Возникали сложности в том, чтобы объект подсказки, был выше фона, но был не доступен для использования во время подсказки. Решилось костылями, при которых в нужный момент объект менял слой и очередность, а после подсказки возвращался к базовым значениям. Работа подсказок на видео ниже:
  • Также для наглядности был добавлен всплывающий текст с уроном, который был нанесен боссу. Цвет фона зависит от количества собранных цифр, всего три цвета: желтый, оранжевый, красный. Выглядит это вот так:

Дневник разработки игры «Numbers: A Chain Match Game»

Надо еще сделать:

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

Планы после релиза:

  • Для режима «Лимит времени» кнопку +1 минута с кд 30 минут за просмотр видео рекламы решил перенести на после релиза, так как не хочется опять лезть в тот кусок кода, абы ничего не сломать как обычно.
  • Режим игры «Выживание», где атаки босса будут также снимать здоровье у персонажа, на поле будут «сердечки» при соединении которых будет восстанавливаться хп.

--- Графика и анимации.

Сделано:

  • Нарисован весь интерфейс, спрайты и анимации всех цифр, главного персонажа, всех боссов и все оружие. Персонажа и боссов сначала делал в MagicaVoxel и потом готовые модели использовал как референс для спрайтов и анимаций.
  • Нарисован собственный пиксельный шрифт для текста.
  • Полностью нарисовано 7 локаций из 11, остальные нарисованы схематически, без деталей. Самый затратный по времени пункт, который и занял большую часть времени разработки.
  • Добавлено освещение, и это одно из глобальных решений, которое кардинально влияет на картинку. Скриншот до и после:
Дневник разработки игры «Numbers: A Chain Match Game»

Освещение сильно повлияло на производительность, после его добавления мой телефон (Samsung a71) стал показывать 15-18 кадров и неистово греться, хотя до этого было 60 FPS. Проблема была в том, что на уровне было 7 источников света направленного и еще 7 как текстуры ламп, и некоторый свет был для нескольких разных слоев и все источники были с включенными тенями, хотя тени используются только в начале игры в одном месте.

В первую очередь я убрал все настройки теней у каждого источника света и включил светить только на один слой по умолчанию. Убрал весь свет, который был текстурами ламп, вместо него оставил просто текстуру, для лучшего вида поставил материал на который не влияет направленный свет, а для имитации включения-выключения света стал менять прозрачность текстуры. Все это помогло, игра осталась выглядеть точно также, но agc на телефоне вернулся к 60 кадрам, а unity показывает на пк 750 кадров против 470 до правок.

Была еще проблема, когда свет из уровня светил на UI, особенно было заметно во время паузы. Это решается переключение рендера на канвасе на Screen Space — Overlay, но тогда перестают правильно работать подсказки, они не выносят над серым фоном объект подсказки. Поэтому рендер оставил Screen Space — Camera, а UI вынес на отдельный слой, на который не попадает свет.

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

Надо еще сделать:

  • Дорисовать 4 уровня.
  • Нарисовать фон для меню.

--- Музыка.

Сделано:

  • Сделан аудиоменеджер с возможностью регулировок громкости из меню настроек.
  • Добавил звуки при соединении цифр и при атаках босса или ноля.
  • Добавил 9 фоновых мелодий, общей продолжительностью 22 минуты. Из-за того, что чем выше уровень, тем больше времени он занимает было решено отказаться от одной мелодии под каждый уровень, слушать одно и тоже больше часа было невыносимо. Сейчас при старте игры аудиоменеджер перемешивает все мелодии и играет их в случайном порядке, а когда мелодии заканчиваются перемешивает еще раз и так пока не надоест. Таким образом одна мелодия не надоедает и нет эффекта когда вы уже помните какой трек за каким играет и ждете его в нужный момент. Вот так выглядит этот кусок кода:

private void Shuffle() { shuffleMusic = Array.FindAll(sounds, sound => sound.name.StartsWith("music_level_")); var rnd = new System.Random(); shuffleMusic = shuffleMusic.OrderBy(s => rnd.Next()).ToArray(); } public IEnumerator ShufflePlay() { if(played == true) { if(indexMusicLevel < shuffleMusic.Length) { currentMusic = shuffleMusic[indexMusicLevel]; currentMusic.source.Play(); yield return new WaitForSeconds(currentMusic.clip.length + 0.1f); indexMusicLevel++; StartCoroutine(ShufflePlay()); } else { Shuffle(); indexMusicLevel = 0; StartCoroutine(ShufflePlay()); } } else { currentMusic.source.Stop(); } }

Надо еще сделать:

  • Исправить несколько мелодий, их концовку обрывает на доли секунд раньше нужного.

Сколько ушло времени и когда релиз?

От идеи и до текущего состояния прошло полтора года из которых на сам кодинг ушло порядка 6 месяцев в сумме, на графику и анимации я потратил еще месяцев 8, остальное время это поиск идей и решений для возникших проблем, опыта то нет. Думаю до релиза еще пол года минимум, как раз к второй годовщине :)

Чтобы набрать аудиторию и фидбек было также решено отправить заявку на участие в конкурсе инди разработчиков Indie Cup W’22, результаты будут в марте-апреле.

Зачем я все это вам пишу?

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

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

Всем спасибо за внимание, и за то, что прочитали до конца. Буду рад вашим комментариям и фидбеку по игре.

1515
7 комментариев

Буду дополнять пока играю

1) Контраст картинки и текста стоит повысить, текст серый на сером блекнет, серый вообще очень опасный цвет для интерфейса. Циферки тоже поконтрастнее сделал.
2) Начало очень медленное, ускорил бы в пару раз, хочется уже играть, а нолик ползет. Мб это мой древний редми 4х так робит хз.
3) Эффект включающихся и моргающих лампочек на поле - 12/10, мое уважение.
4) Музло жесткое, я сначала даже в ступор впал, а пятка начала долбить пол под 220 бпм. Медлительность геймплея как-то не вяжется с рейв тусой.
5) Звуки тоже слишком сухие, не оч приятно долго слушать.
6) Первый калькулятор долго пилится очень, игроку вначале нужно быстрее получать "кайф" от победы и приобретение чего-то.
7) Часто получается, что куча цифр одинаковых скапливается, возможно стоит попробовать сделать, чтобы подряд цифры тоже в цепочку вкладывались. Геймплей получится другой, но мб будет намного бодрее и интереснее.
8) Я хз мб дальше будет, но я добавил бы бустов или еще что-то такое. Как во всех 3-в-ряд.

2

Визуал классный, концепт прикольный, не хватает чутка экшена на экране и в действиях игрока. Если геймплей чуть пободрее сделать, очень прикольное залипалово получится.
В целом, игра вязкая, мб опять же из-за моей старой мобилы. Нет, посмотрел ролик - там тоже самое. Надо все делать побыстрее, даже если это стилизация под 8-16 бит. Даже тупо анимации ускорить в 2 раза, уже живее будет смотреться мб.

1

Игра прикольная, механика кажется новой, во всяком случае я такой интерпретации 3 в ряд не встречал, пару моментов выделю
1) у боссов слишком много хп, одного бить приходится несколько минут, что начинает утомлять
2) долгие переходы между уровнями, я сначала и не понял почему мой перс просто идет
3) поправить алгоритм, часто нет какой то цифры, а 1 или 5 занимают почти весь экран
4) не хватает какой то награды, может усиления или кастомизация персонажа
В остальном очень круто!

1

Большое спасибо за отзыв, всегда рад обсуждать любые вопросы, по вашим моментам:
1) у последнего босса вообще 200к хп, дело в том, что боссов всего 8, а последний уровень чисто декоративный, для тех кто все прошел но хочет побить рекорд. И если у боссов будет мало здоровья, то уровни закончатся очень быстро и все станет однообразно. А так есть некий стимул пройти текущего босса и увидеть кто же следующий.
2) Когда ноль добивает босса, он его якобы делит на ноль /0, подбирает его оружие и идет дальше, такая себе лайт кастомизация персонажа.
3) Сложность еще надо балансить, 1 и 5 остаются чаще, так как у них только в одна цифр для "контакта" 2 и 4 соответственно, когда например у цифры 3 это 2 и 4. Если заполнять поле полностью рандомно, то игрок не может повлиять на исход, а так надо равномерно убирать накопившиеся одинаковые цифры, в любом случае если на поле уже цифра встречается N количество раз, она больше не появится, для размера поле 5 это N больше 8 раз
4) Да, надо подумать над этим, сейчас в качестве награды это смена оружия, на оружие убитого босса, а в плане геймплея это перемешивание поля, которое порой спасает

1

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

1