В этом уроке мы узнаем как легко сделать в Unity 2D игру наподобие Flappy Bird, выпущенной в 2013 году и ставшей самой скачиваемой в iOS App в январе 2014 года.
Идея игры следующая: птица должна лететь вперед не сталкиваясь с препятствиями. Такие простые игры, как эта, идеально подходит для учебника. Все, что нам потребуется - 40 строк кода и несколько спрайтов.
В нашем учебнике используется Unity 5.0.0f4. Игра будет работать и в более новых версиях Unity, работа в старых версиях не гарантируется. Бесплатная версия Unity 5 теперь поставляется со всеми функциями движка, поэтому мы рекомендуем именно ее.
Настройка проекта
Запустите Unity и выберите New Project (Новый проект):
Назовите его flappybird, выберите где он будет храниться, например, на C:\, выберите 2D и нажмите на Create Project (Создать проект):
Если мы выберем Main Camera (Основная камера) в Hierarchy (Иерархия) то мы можем сделать Background Color (Фоновый цвет) светло-голубым (R=198, G=208, B=230) под цвет неба и задать Size (Размер) как показано на рисунке ниже:
Как сделать фон в Unity 2D
Начнем мы с того, что нарисуем небо на фоне:
Щелкните правой кнопкой мыши на изображении выше, выберите Save As..., перейдите в папку Assets и сохраните картинку в новой папке Sprites. После сохранения, мы можем выбрать фон в Project Area:
Измените Import Settings в Инспекторе:
Величина Pixels Per Unit , равная 16
, означает, что 16х16 пикселей поместится в одном объекте в игровом пространстве. Мы будем использовать это значение для всех наших текстур, потому что размер птицы - 16х16 пикселей и это должно быть одним объектом в нашей игре.
Давайте добавим фон в игровой мир, перетащив его из Project Area на Main Camera в Иерархии:
Так фон становится потомком для Main Camera:
Теперь, когда фон является потомком камеры, он всегда будет идти следом за камерой. Таким образом, игрок всегда будет видеть фон.
Мы могли бы поместить несколько фонов рядом друг с другом так, чтобы при перемещении камеры в горизонтальном направлении все равно был бы виден фон, но сделать его потомком камеры намного проще.
Обратимся к вкладке Инспектор и установим позицию фона Y=-1
так, чтобы он как раз подходил к игре и в дальнейшем:
Если нажать Play, то мы увидим небо на заднем фоне:
Существует еще одна необходимая корректировка. В ближайшее время мы добавим птицу и некоторые препятствия, так что давайте убедимся, что фон на самом деле нарисовал позади всего остального. В Unity используются свойства SpriteRenderer: Sorting Layer (Сортировка Слоя) и Order in Layer (Порядок в Слое), чтобы решить какой слой игры должны находиться впереди, а какие за ними.
Мы установим Order in Layer в -1
, так что все остальное будет нарисовано перед небом:
Чем больше величина, тем вероятней, что слой будет находиться на переднем плане. При уменьшении величины вероятность нахождения слоя на заднем плане возрастает.
Ландшафт
Давайте также нарисуем какой-нибудь ландшафт на земле. Мы сделаем его очень широким, чтобы хватило места для наших препятствий:
Щелкните правой кнопкой мыши на изображение, выберите Save As... (Сохранить как...) и сохраните изображение выше в проекте в папке Assets/Sprites. Выберем землю в Project Area, а затем назначим те же Import Settings (Настройки Импорта), что мы использовали ранее:
После этого мы перетащим его из Project Area в Hierarchy (Иерархия) снова (обратите внимание: на этот раз мы не будем делать его потомком камеры):
Взгляните на вкладку Inspector (Инспектор) и спозиционируйте нашу землю в X=16
, а Y=-6
: так она будет находится ниже фона, а большая часть области окажется в правой части экрана:
На этот раз мы зададим Order in Layer (Порядок в Слое) значение, равное 1
, чтобы слой всегда находился перед птицей и препятствиями:
Ground Physics
Почва должна быть частью игрового мира. Сейчас это просто изображение в игровом мире, только визуальный эффект и больше ничего. Мы хотим, чтобы земля была как стена, с которой птица может столкнуться, поэтому давайте выберем Add Component→Physics 2D→Box Collider 2D в Инспекторе:
По идее, на этом можно было бы закончить, но осталось еще одно маленькое «но».. В дальнейшем мы добавим препятствия в нашу игру (как зеленые трубы в оригинальной игре Flappy Bird) и эти препятствия будут перемещаться вверх и вниз. Препятствия и земля будут частью игрового мира и, в соответствии с законами физики, не может быть двух объектов в одной точке (или, в нашем случае, двух Коллайдеров).
Есть несколько способов обойти эту проблему. Как обычно, мы выберем самый простой путь, создав новый слой, который мы будем использовать для земли и препятствий. После этого мы сообщим Unity игнорировать столкновения в/между этим слоем.
Мы можем создать новый слой, выбрав Add Layer (Добавить Слой) в Инспекторе:
После этого мы добавим один User Layer (Пользовательский Слой), давайте назовем его WeirdPhysics:
Теперь мы можем выбрать землю в Иерархии, а затем снова назначить слой WeirdPhysics:
Затем мы выберем Edit→Project Settings→Physics 2D в верхнем меню и отключим столкновения WeirdPhysics в Layer Collision Matrix, которая определяет как будет себя вести система обнаружения столкновений, привязанных к слоям:
В Unity редко приходится делать что-то такое, но наша игра как раз является исключением.
Теперь земля никогда не столкнется с каким-либо препятствием. Кроме того, если мы нажмем на кнопку Play, то увидим не только небо, но и землю:
На этом первая часть нашего урока подошла к концу. В следующем уроке Игра Flappy Bird на Unity 2D. Часть 2 мы поработаем над нашим пернатым героем.