В этом уроке мы закончим делать в Unity 2D игру наподобие Flappy Bird, выпущенной в 2013 году и ставшей самой скачиваемой в iOS App в январе 2014 года.
В прошлом уроке Игра Flappy Bird на Unity 2D. Часть 2 мы добавили в игру птицу и научили ее летать. Теперь введем в игру препятствия, чтобы в нее было интересно играть.
Перемещение камеры
Сейчас камера никогда не перемещается, а это значит, что наша птица рано или поздно исчезнет. Решим эту проблему, создав новый скрипт, который заставляет камеру все время следовать за птицей.
Выберите Main Camera в Иерархии и нажните на Add Component&rarrow;New Script, назовите его CameraFollow и выберите в качестве языка CSharp. Мы также переместим его в нашу папку Scripts, а затем откроем его:
using UnityEngine;
using System.Collections;
public class CameraFollow : MonoBehaviour {
// Используйте эту функцию для инициализации
void Start () {
}
// Update вызывается один раз за кадр
void Update () {
}
}
Нам не нужна функция Start, поэтому удалим ее. Давайте добавим публичную переменную Transform для указания направления следования:
using UnityEngine;
using System.Collections;
public class CameraFollow : MonoBehaviour {
// Направление следования
public Transform target;
// Update вызывается один раз за кадр
void Update () {
}
}
Теперь мы будем просто использовать функцию Update чтобы всегда устанавливать X-позицию (положение по горизонтали) камеры в X-позицию target:
// Update вызывается один раз за кадр
void Update () {
transform.position = new Vector3(target.position.x,
transform.position.y,
transform.position.z);
}
Наш скрипт готов. Однако, считается хорошей практикой начать движение камеры после того, как все в сцене обновлено. для этого мы переименуем функцию Update в LateUpdate:
void LateUpdate () {
transform.position = new Vector3(target.position.x,
transform.position.y,
transform.position.z);
}
Сохраните скрипт, после чего взгляните на вкладку Инспектор и перетащите игровой объект bird_0 из Иерархии в слот скрипта Target:
Если вы сейчас нажмете на кнопку Play, то вы увидите, что камера автоматически следует за птицей
Создаем препятствия в Unity
Рисуем препятствия
Сейчас наша игра не вызывает затруднений в прохождении. Изменим это, добавив различные препятствия. Давайте нарисуем одно (сохраните его в папке Assets/Sprites):
Мы будем использовать следующий импорт настроек:
Перетащите изображение из Project Area в Иерархию для того, чтобы создать из него игровой объект:
Мы будем позиционировать его в X=3, Y=-5:
Вот как это выглядит на сцене:
Физика препятствий
Препятствие должно быть частью физического мира, чтобы птица могла столкнуться с ним, поэтому давайте выберем Add Component→Physics 2D→Box Collider 2D в Инспекторе:
Мы уже говорили о том, как препятствия могут оказаться внутри земли и о том, что мы не хотим, чтобы они сталкивались, так что давайте сделаем их частью нашего слоя WeirdPhysics:
Так как мы отключили столкновения в промежутке между нашим слоем WeirdPhysics, земля никогда не столкнется с препятствием. Птица все еще может столкнуться с землей и с препятствием, поскольку она расположена на другом слое (по умолчанию one).
И так, некоторые из препятствий также должны двигаться вверх и вниз. Всем объектам, которые должны двигаться, нужно Rigidbody (жесткое тело), так что выберите Add Component→Physics 2D→Rigidbody 2D в инспекторе снова. Мы не хотим, чтобы это происходило под действием силы тяжести, поэтому давайте установим Gravity Scale в 0
. Мы также не хотим, чтобы происходило вращение, поэтому снова включим Fixed Angle:
Если нажать на Play и сделать так, чтобы птица налетела на препятствие, то мы увидим как уровень перезагружается:
Перемещение препятствий
Ладно поэтому некоторые из препятствий, должны двигаться вверх и вниз. Такое поведение может быть реализован с помощью сценария снова. Выделим Add Component→New Script, назовем новый скрипт Obstacle, переместим его в папку Scripts и откроем для редактирования. Есть много различных способов сделать препятствие двигаться вверх и вниз все время. Как обычно, мы будем использовать самый простой способ.
Начнем с того, что добавим переменную speed а затем настроим свойство velocity так, чтобы препятствия двигались вверх с заданной скоростью speed:
using UnityEngine;
using System.Collections;
public class Obstacle : MonoBehaviour {
// Скорость движения (0 – без движения)
public float speed = 0;
// Используется для инициализации
void Start () {
// Направление первоначального движения
GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
}
// Update вызывается один раз за кадр
void Update () {
}
}
Наша хитрость заключается в том, чтобы использовать Unity-функцию InvokeRepeating, чтобы изменять скорость каждые несколько секунд:
using UnityEngine;
using System.Collections;
public class Obstacle : MonoBehaviour {
// Скорость движения (0 – без движения)
public float speed = 0;
// Переключение направление движения каждые х секунд
public float switchTime = 2;
void Start() {
// Направление первоначального движения
GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
// Переключение через каждые несколько секунд
InvokeRepeating("Switch", 0, switchTime);
}
void Switch() {
GetComponent<Rigidbody2D>().velocity *= -1;
}
}
Функция Switch
просто изменяет скорость Rigidbody. Затем мы используем InvokeRepeating чтобы сказать Unity вызывать эту функцию каждые несколько секунд. Мы также добавили переменную switchTime, чтобы определить время вызова параметра Switch.
Давайте сохраним сценарий и установим для препятствия Speed в 1
:
Если мы не хотим, чтобы препятствия перемещались, то установите Speed в 0
или отключите скрипт.
Если нажать сейчас на кнопку Play то мы сможем увидеть как наше препятствие движется вверх и вниз:
Увеличиваем число препятствий
Щелкните правой кнопкой мыши на препятствие в Иерархии, выберите Duplicate и переместите препятствие немного дальше вправо:
Мы также будем дублировать препятствие и устанавливать его свойство Scale.Y в -1
:
Теперь это выглядит верно, если позиционировать все кверх-ногами:
Мы можем добавить сколько угодно препятствий и с таким количеством различных свойств speed и switchTime:
Мы только что узнали, как невероятно просто сделать игру Flappy Bird в Unity. Попробуйте проявить творческую жилку и сделать игру более трудной и интересной.