Первая игра на Unity3d или как я не потратил зря отпуск
Всё началось с того, что в этом году на работе заставили заранее выбрать даты отпуска и планово в него уйти. Моё обычное "а, потом отпуск, сейчас не до отдыха" в этом году не сработало.
Моя работа связана с гейм девом, я пишу сервера для мобильных игр. А в отпуске человеку положено заниматься чем? Правильно, отдыхом от работы. Именно поэтому я занялся написанием простенькой мобильной игры на Unity3d=) Это была далеко не первая попытка познакомиться с этим движком, зато первая попытка, доведённая до финального результата.
Fly - финальный результат моих двухнедельных трудов.
А теперь немного о процессе разработки, моих ожиданиях и том, как оно получилось.
Идея игры - два друга отправляются в полёт на воздушном шаре, в процессе которого уворачиваются от различных препятствий или врагов и собирают некие "бонусы" (звёздочки, монетки). Управление - дирижабль может передвигаться по вертикали вверх/вниз.
Начать в этот раз я решил с поиска графики, хотя бы немного удовлетворяющей игровой идее и остановился на kenney game assets. Дирижабля там не было, зато был неплохой набор спрайтов для игры "tappy plane", который я и использовал.
Теперь немного о внутренней логике приложения. Единственным объектом, который не перемещается по оси Х будет наш главный самолёт. Все прочие объекты проносятся мимо него. Задники - генерящиеся объекты(облачка, башенки, деревья, земля), скорость которых зависит от Z координаты, что позволяет создать эффект параллакса(или лично мне так кажется). Монеты и вражеские самолёты тоже генерируются, но несколько хитрее. О них ниже.
Простое распределение на игровом поле монеток случайным образом выглядит и скучно, и раздражающе, ведь очень часто они располагаются так, что физически невозможно собрать две подряд. Так что первым делом я написал генерацию новых монеток, зависящую от скорости движения монеток и максимальной вертикальной скорости игрового самолёта, теперь игрок всегда сможет преодолеть расстояние между двумя соседними монетами. Далее стал вопрос генерации не отдельных монет, а каких нибудь наборов (линия, треугольник, дуга из монет). Для этого я придумал два варианта создания таких наборов
1. создание шаблонов-матриц в текстовом виде, где каждый символ матрицы обозначает или монету, или пустое поле
OOOXOOO
OOXXXOO
OXXXXXO
2. создания набора префабов, каждый из которых будет включать контейнер, в который будут добавлены монеты с фигурным расположением и координатами относительно контейнера.
Я выбрал второй вариант, ибо счёл его более простым и быстрым для данной задачи.
В итоге у меня получился генератор монет, который имел набор префабов, каждому из которых был задан его вес. При удалении последнего сгенерированного контейнера монет на Random.Range(0.8f, 1.2f) * DefaultDistance от правого края экрана за экраном генерировался новый набор в соответствии с вероятностью его веса.
Теперь о вражеских самолётах. Их три типа.
Простой - быстро проносится по прямой.
Шальной - имеет меньшую скорость движения, зато летит по параболе, чем зачастую удивляет игрока.
Жёлтый - преследует игрока, меняя свою траекторию.
Как это работает? Простой тип не вызывает вопросов. Есть начальная скорость и небольшое ускорение по оси X, которое он получает каждый FixedUpdate. Шальной задаётся начальной скоростью и ускорением из диапазона (диапазон подобран вручную) по оси Y. Жёлтый ... Для жёлтого я задал Vector2 с ускорениями (к примеру 1f, 1f) и каждый гарантированный кадр он получает ускорение, равное произведению заданного вектора на вектор нормали к игроку.
Система генерации врагов случайным образом выбирает префаб с врагом, уменьшая время между врагами после каждого нового призыва(но до определённого предела)
Создав весь этот бедлам, я попробовал сделать первый android билд и с огорчением отметил, что система управления из первоначальной идеи смотрится на мобильных телефонах не очень. Две кнопки можно было бы расположить слева друг над другом, но тогда игрок будет вынужден нажимать на них одним пальцем, постоянно перемещая его по экрану, двигая и ошибаясь. Можно было их расположить внизу справа и слева, но тогда правая кнопка закрывала бы часть экрана, где могли бы появляться противники. Разбираться с виртуальным джойстиком я был морально не готов и пришлось реализовать однокнопочное управление, где при нажатии в любой части экрана самолёт начинал двигаться вверх, а без нажатия летел бы самостоятельно вниз. Благодаря этому управлению мне не избежать обоснованных и праведных сравнений с tappy bird и retry от Rovio.
Это, в общем то, основная часть игры, написанная и протестированная за 2 дня. Чем же я занимался всё остальное время? А тем, что совершенно не умею делать - UI, интеграцией с Google Play, созданием проекта в Google Developer Console.
Но больше всего времени у меня занял поиск музыки... Я около трёх дней провёл, прослушивая различные треки и слабо представляя, что в действительности хочу услышать. Совершенно не представляю, как пишут задания для композиторов на музыку... В итоге музыка была найдена на сайте PlayOnLoop. Там действительно неплохая подборка зацикленной фоновой музыки.
Какие у меня были изначально планы? Я хотел создать 2 игры за 2 недели отпуска, изучить движок, а точнее его 2d составляющую. Получилось же лишь одна игра, да и та едва влезла в этот график. Жалею ли я о потраченном времени отпуска? Нет, было весело!
И это непередаваемое ощущение - залипать в собственную игру=)





