Unity - потрясающий фреймворк, для создания 2D и 3D игр, который становится все более и более популярным. В этом уроке мы увидим, как сделать простой 2D космический шутер на Unity и Javascript (Unityscript).
Настройка Unity
Запустите Unity, и в верхнем меню выберите "File -> New Project". Назовите каталог проекта (например, SpaceShooter) и убедитесь, что выбран режим "2D" в выпадающем списке.
Теперь вы должны увидеть интерфейс Unity, специально предназначенный для создания 2D игр. Вот как он выглядит.
Интерфейс Unity делится на 6 вкладок:
- Project: показывает все активы (ассеты) игры (изображения, звуки и т.д.)
- Hierarchy: показывает все элементы, находящиеся на сцене
- Scene: позволяет устанавливать и позиционировать игровые объекты
- Game: интерактивный просмотр игры
- Inspector: показывает информацию связанную с выбранным объектом
- Console: отображает полезные отладочные сообщения
За работу! Перейдите на вкладку Project, затем выберите "Create -> Folder" и создайте 4 папки:
- Textures, где мы будем хранить все изображения
- Scripts: со всем нашим Javascript-кодом
- Prefabs, которая будет содержать все наши игровые объекты
- Scenes будет хранить различные сцены игры
Теперь скачайте файлы, содержащие все картинки нашей игры и переместите их в директорию "Textures", которые мы только что создали.
Теперь вы должны сохранить вашу сцену. Сделайте "File -> Save Scene". Unity попросит вас назвать свою сцену, вы можете назвать ее "MainScene". Не забудьте переместить "MainScene" в папку Scenes.
Добавляем фон в сцену
Перетащите фоновое изображение из папки Textures на вкладку Hierarchy.
Выберите фон на вкладке Hierarchy. Вы можете видеть, что вкладка Inspector теперь содержит информацию о нашем фоне.
В Unity каждый объект имеет некоторые компоненты, присоединенные к нему. Вы можете добавить новый компонент к объектам, и настроить их значения. Есть много доступных компонентов, основными из которых являются:
- Transform: отвечает за положение, поворот и масштаб объекта
- Renderer: содержит отображаемый спрайт
- Script: скрипт для данного конкретного объекта
- Rigidbody: для добавления физики (гравитация, скорость и т.д.)
- Colliders: чтобы заставить объект сталкиваться с другими объектами
Добаление космического корабля
Теперь перетащите космический корабль на вкладку Hierarchy. Так как мы хотим, чтобы на наш корабль действовали законы физики, мы должны добавить ему "Rigidbody". Для этого перейдите к вкладке Inspector и проделайте следующие действия: "Add component -> Physics 2D -> Rigidbody 2D". Удостоверьтесь, чтобы напротим пункта "is Kinematic" стоит галочка, иначе наш корабль упадет под действием силы тяжести.
Измените положение корабля во вкладке Hierarchy на -4, чтобы расположить его внизу экрана.
Далее, мы хотим управлять нашим космическим корабем, поэтому нам нужно написать небольшой код. Выберите корабль, и во вкладке Inspector сделайте "Add Component -> New script" (Добавить компонент -> Новый скрипт). Назовите его "spaceshipScript", и выберите параметр "Javascript" в выпадающем списке (the gif below select "CSharpt", and that's a mistake).
Найдите "spaceshipScript" на вкладке проекта (Project), поместите его в папку Scripts. Затем дважды щелкните по сценарию, чтобы открыть редактор кода и заменить код по умолчанию, это:
// Эта функция вызывается ~ 60 раз в секунду
function Update() {
// GetAxis () возвращает значение от 1 до -1
// в зависимости от того нажата ли клавиша со стрелкой
// Так мы меняем скорость космического корабля X
// по GetAxis ("Horizontal") * 10
rigidbody2D.velocity.x = Input.GetAxis("Horizontal") * 10;
}
Теперь, когда у нас есть космический корабль, мы можем протестировать игру. В Unity сделать это очень просто: достаточно нажать кнопку воспроизведения в верхней части экрана. Но прежде, вы должны перейдити на вкладку game (игра) и установить соотношение сторон равным 5:4.
Теперь нажмите кнопку воспроизведения и вы сможете двигать корабль вправо и влево с помощью клавиш со стрелками.
Нажмите кнопку воспроизведения, чтобы остановить игру.
Стрельба
Наш корабль уже не неподвижная посудина, но лучше, если бы мы могли еще и стрелять. Давайте сделаем это.
Перетащите изображение с пулями на вкладку Иерархия (Hierarchy), добавьте компонент "Rigidbody 2D" к нему, и не забудьте поставить галочку рядом с "is Kinematic".
Затем мы добавляем новый скрипт для пули так же, как мы сделали это с кораблем. Откройте скрипт "bulletScript", и добавьте в него этот код:
// Публичные переменные
public var speed : int = 6;
// Вызывается один раз, когда пуля создается
function Start () {
// Установите скорость по оси Y, чтобы пуля двигалась вверх
rigidbody2D.velocity.y = speed;
}
// Вызывается, когда объект выходит за пределы экрана
function OnBecameInvisible() {
// Уничтожить пулю
Destroy(gameObject);
}
Поскольку мы устанавливаем переменную speed
как публичную, то что мы можем напрямую редактировать ее во вклвдке инспектор (Inspector). Это очень удобно, если вам нужно быстро настроить значение переменной без редактирования самого скрипта. Не забудьте потом прописать подобранное значение в самом скрипте!
Наша пуля готова, нам осталось только «сохранить» ее, чтобы можно было использовать ее повторно. Просто перетащите пулю из вкладки Иерархия в папку Prefabs, а затем удалить пулю из сцены.
Космические пульки
Для того, чтобы космический корабль стрелял пулями, нам нужно будет внести некоторые изменения в наш "spaceshipScript". Откройте его, и отредактируйте вот так:
// Переменная, которая будет содержать префаб наших пуль
public var bullet : GameObject;
function Update() {
// Перемещение корабля по горизонтали
rigidbody2D.velocity.x = Input.GetAxis("Horizontal") * 10;
// При нажатии пробела
if (Input.GetKeyDown("space")) {
// Создайте новую пулю в "transform.position",
// которая является текущим положением корабля
Instantiate(bullet, transform.position, Quaternion.identity);
}
}
Теперь надо помочь Unity понять, что из себя представляет переменная "пули". Поскольку мы сделали ее публичной, можно просто перетащить префаб пули в инспектор корабля таким образом. Since
Нажмите кнопку воспроизведения. Теперь двигаться и стрелять пулями при нажатии на клавишу пробел. Все это с помощью 15 строк кода и это только начало!
Неприятели
Настало время создать врагов, которые будут вставлять нам палки в колеса. Это будет очень похоже на то, что мы сделали, чтобы создать пули.
Перетащите врага из папки Textures во вкладке Hierarchy, добавьте компонент Rigidbody и убедитесь, что галочка стоит напротив пункта "is kinematic" (мы не хотим чтобы на врага действовала сила тяжести).
Затем добавьте компонент сценария к противнику под названием "enemyScript" с таким кодом:
// Публичная переменная, содержащая значение скорости врага
public var speed : int = -5;
// Функция вызывается, когда враг создан
function Start () {
// Добавим вертикальную скорость врагу
rigidbody2D.velocity.y = speed;
// Пусть противник вращается вокруг своей оси
rigidbody2D.angularVelocity = Random.Range(-200, 200);
// Уничтожить врага через 3 секунды,
// после попадания за пределы экрана
Destroy(gameObject, 3);
}
Теперь, когда враг готов, мы должны "сохранить" его, сделав префабом. Просто перетащите противника в папку Prefabs, и удалить из Нierarchy.
Мы хотим случайным образом порождать врагов на верхней части экрана. Давайте создадим новый объект, откуда они будут появляться. Перетащите наш объектиз папки Textures во вкладку Нierarchy и просто спозиционируйте его над фоном.
Теперь добавьте к нему новый скриптовый компонент под названием "spawnScript" с помощью этого кода:
// Переменная для хранения вражеского префаба
public var enemy : GameObject;
// Задаем насколько быстро должны создаваться новые враги
public var spawnTime : float = 2;
function Start() {
// Вызваем функцию 'addEnemy' каждые 'spawnTime' секунд
InvokeRepeating("addEnemy", spawnTime, spawnTime);
}
// New function to spawn an enemy
function addEnemy() {
// Переменные для хранения положения по оси X
// вражеских объектов. Смотреть фото ниже
var x1 = transform.position.x - renderer.bounds.size.x/2;
var x2 = transform.position.x + renderer.bounds.size.x/2;
// Случайно выбираем точку внутри spawn объекта
var spawnPoint = new Vector2(Random.Range(x1, x2), transform.position.y);
// Создаем врага, спозиционированного в 'spawnPoint'
Instantiate(enemy, spawnPoint, Quaternion.identity);
}
Этот код создает нового врага каждые spawnTime
секунд где-то на белой линии:
Не забудьте настроить публичную переменную, перетащив префаб врага на его ввод:
Теперь вы можете протестировать игру, нажав на кнопку "Play". Вот, что у нас должно получиться:
Враги появляются как и должны, но у нас нет никаких столкновений. Давайте посмотрим, как исправить это.
Столкновения
Космический корабль, враги, и пули все должны сталкиваться друг с другом. Чтобы это работало, каждый из этих объектов должен иметь новый компонент под названием "box collider". Для этого вы должны проделать над нашими объектами следующий порядок действий: "Add Component -> Physics 2D -> Box Collider 2D":
Затем выберите префаб противника, и поставьте галочку напротив опции "is trigger" в бокс-коллайдере. В результате Unity будет вызвать функцию OnTriggerEnter2D
при каждом столкновении врага с чем-то.
Теперь добавьте эту новую функцию в конец enemyScript:
// Функция вызывается, когда враг сталкивается с другим объектом
function OnTriggerEnter2D(obj : Collider2D) {
var name = obj.gameObject.name;
// Если враг столкнулся с пулей
if (name == "bullet(Clone)") {
//Уничтожить себя
Destroy(gameObject);
// и уничтожить пулю
Destroy(obj.gameObject);
}
// Если столкнулся с космическим кораблем
if (name == "spaceship") {
// уничтожить себя
Destroy(gameObject);
}
}
Вот, что у нас должно получиться в итоге: