С выпуском Unity 4.3, разработчикам больше не пришлось использовать сторонние библиотеки или создавать свои собственные решения для создания 2D игр. С того дня они обрели доступ к 2D набору инструментов прямо в Unity. В сочетании с уже имеющимися стандартными инструментами программы процесс создания 2D игр в Unity перестал быть болезненным процессом и теперь вы можете весело провести время программирую очередную 2D игрушку).
В этом уроке мы с вами как следует повеселимся и создадим в Unity 2D игру (в стиле Jetpack Joyride), персонажами которой будут мышь и ее летающий ранец. Цель игры - украсть реактивный ранец и летать, собирая висящие монеты и уворачиваясь от лазеров. Теперь, мы переделаем ее для с сенсорных экранов. Готовы начать?!
Начинаем делать 2D игру в Unity
В первой из трех частей нашей серии уроков вы узнаете как работать с физикой в Unity, как использовать сортировку слоев для организации спрайтов, как использовать коллайдеры, чтобы определить границы вашего игрового мира, и даже, как убить мышь, а то и две. :]
Для начала вам понадобится некоторые картинки, звуковые эффекты и музыка для игры. Я подготовил архив, который содержит все, что вам потребуется. Вы можете скачать его здесь: RocketMouse_Unity_Resources
Для понимания материала требуется, чтобы у вас был, по крайней мере, некоторый опыт работы с Unity. Вы должны знать, как работать с интерфейсом, добавлять ассеты игры, компоненты игровых объектов и так далее.
Создание и настройка проекта
Откройте Unity и создайте новый проект, выбрав File\New Project…. Если вы создали не один 2D проект в Unity, вы можете просто скачать файлы для запуска проекта, распаковать их и перейти к разделу Добавление игровых ассетов.
Как вы, наверное, знаете, вы можете поддерживать множество различных платформ и решений при создании игры с Unity. Тем не менее, для простоты, в этом уроке вы будете работать с ресурсами, предназначенными для iPhone Retina.
Когда откроется окно мастера проекта, нажмите Set
(Установить) на вкладке Create new Project
(Создать новый проект) чтобы установить каталог для вашего проекта. В поле Save As (Сохранить как) напишите имя проекта - RocketMouse и выберите папку, в которой вы хотите сохранить этот проект. Нажмите Save
(Сохранить), когда закончите. Не спешите нажимать на кнопку Create Project
(Создать проект). До этого, вам нужно выбрать из списка 2D
в поле с надписью Set up defaults for:
(Настройка по умолчанию для:). После этого, вы можете смело жать на Create new Project
.
Хотя задание значения установке по умолчанию при создании нового проекта равным 2D, должно быть единственным, что вы должны изменить, чтобы перейти в режим 2D, иногда это не работает. Ну, по крайней мере, это не сработало несколько раз у для меня, в том числе и при написании статьи. Так что лишний раз убедитесь, что вы находитесь в режиме 2D. Вот список того, что вы должны проверить, чтобы убедиться, что все настройки выставлены для 2D проекта:
-
Выберите Edit\Project Settings\Editor чтобы открыть настройки редактора в Инспекторе (Inspector). В разделе Default Behavior Mode убедитесь, что Mode установлен в положение 2D, как это показано на скриншоте ниже:
-
Во вкладке Сцена (Scene view) должен быть включен 2D режим:
-
Выберите Main Camera в Иерархии и убедитесь, что Projection установлен на Orthographic и его Position (Позиция) установлен на (0,0, -10).
После проверки и регулировки всех параметров создайте папку по имени Scenes в Браузере проекта (Project browser). Затем откройте диалоговое окно Save Scene, выбрав File\Save Scene
или с помощью ⌘S
(Ctrl + S
на Windows). Перейдите к папке Scenes, которую вы только что создали, и назовите сцену RocketMouse.unity
и нажмите кнопку Save
(Сохранить).
Настройка вкладки Game (Игра)
Перейдите во вкладку Игра и установите размер окна, в котором мы будем смотреть на нашу игру, равным 1136×640. Если у вас нет опции resolution
в списке, создайте ее и назовите iPhone Landscape.
Выберите Main Camera в Иерархии. В инспекторе, внутри компонента Camera, установите Size равным 3.2.
Сохраните сцену. Вы сделали важные изменения настроек конфигурации, без которых игра не будет работать так, как надо. Теперь займемся персонажем.
Добавление персонажа
В этом разделе руководства по созданию 2D игры Unity вы добавите забавного персонажа с реактивным ранцем. У меня это будет мышь, а вы можете сделать Карлсона)
Если вы пропустили этап настройки проекта и просто скачали файлы проекта, то продолжайте отсюда.
Прежде чем начать, убедитесь, что вы скачали архив с файлами для этой игры. После распаковки архива, вы увидите две директории: Sprites и Audio. В этом уроке вам потребуются файлы из папки Sprite, а про папку Audio можете пока забыть).
Начнем с импорта игровых ассетов. Чтобы добавить все ассеты за один раз выберите обе папки Sprites и Audio и перетащите их в Браузер проекта, расположив рядом с папкой Scenes, которую вы создали ранее. Конечно, папки не появятся в Браузере проекта так быстро, как это показано на рисунке ниже. Вам придется подождать, пока файлы не обработаются Unity, но это не займет много времени.
Итак, вы только что добавили все необходимые ассеты. В этот момент может показаться, что у нас слишком много странных файлов. Не волнуйтесь, большинство изображений всего навсего являются украшениями и фонами. Кроме того, есть изображения для мыши, лазеров и монет.
Теперь, давайте добавим нашу мышку на сцену. Откройте папку Sprites в Браузере проектов и найдите в этой папке спрайт по имени mouse_fly. Перетащите его на сцену.
Создадим объект в Иерархии, назвав mouse_fly (также, как изображение, используемое для его создания).
Выберите mouse_fly в иерархии и сделайте следующие изменения в Инспекторе:
- Измените его название на mouse, поскольку это будет лучше описывать игровой персонаж.
- Установите его Position в (0, 0, 0) (вы переместите мышь в конечное положение чуть позже, а сейчас расположим ее прямо в центре экрана, чтобы лучше видеть)
- Добавьте компонент Circle Collider 2D, нажав на Add Component в Инспекторе. In the drop down menu select Physics 2D and then choose Circle Collider 2D.
- Установите Радиус Circle Collider 2D равным 0.5.
- Добавьте компонент Rigidbody 2D, кликнув на Add Component (Добавить компонент) и выберите Physics 2D\Rigidbody 2D.
- поставьте галку в чекбоксе Fixed Angle внутри компонента Rigidbody 2D.
Вот изображение, которое демонстрирует все этапы:
Зеленый круг на рисунке показывает коллайдер. Вы, наверное, заметили, что его размер изменяется, когда вы изменили свойство Radius компонента Circle Collider 2D. Коллайдеры определяют форму, которая используется для определения столкновений с другими объектами. Вы можете создать идеальный коллайдер с большим числом пикселей с помощью компонента Polygon Collider 2D, как на скриншоте ниже:
Тем не менее, использование сложных коллайдеров делает более трудным для физического движка обнаружение столкновений, что, в свою очередь, приводит к потере производительности. Только представьте себе, насколько легче проверить, сталкивается ли круг с прямоугольником, чем в случае, когда сталкиваются два комплексных полигона. Именно поэтому рекомендуется использовать простые коллайдеры, когда это возможно. Как вы видите, коллайдер ввиде круга очень хорошо работает в этой игре. Не забудьте олько настроить радиус коллайдера, чтобы он соответствовал оригинальному изображению мыши.
В то время как коллайдеры определяют форму объекта, Rigidbody ставит объект вашей игры под контроль физического движка. Без Rigidbody игровой объект не зависит от силы тяжести, поэтому вы не сможете применить на него силу и крутящий момент. На самом деле, вы даже не сможете обнаружить столкновение между двумя игровыми объектами, хотя оба могут иметь в качестве компонента коллайдер. Один из объектов должен иметь компонент Rigidbody.
Итак, вы хотите, чтобы мышь зависела от силы тяжести и сталкивалась с другими объектами, но не хотите, чтобы она поворачивалась. К счастью, это легко решить включив свойство Fixed Angle в компоненте Rigidbody 2D. Запустите сцену и смотрите как мышь падает под действием силы тяжести.
Почему мышь падает и проваливается? Вы не добавили силу тяжести в Rigidbody ... или добавили все-таки? На самом деле, когда вы добавили компонент Rigidbody 2D, она была подключена по умолчанию (Gravity Scale = 1). Это говорит системе о том, чтобы падение объектов выполнялось, используя по умолчанию гравитацию физического движка.
Создание скрипта для управления реактивным ранцем
Не позволяйте, что мыши упасть в пропасть. Вы должны добавить скрипт, который позволит реактивный ранец и применять силу к объекту mouse, чтобы переместить его вверх и удержать от падения. Чтобы добавить скрипт к объекту mouse выполните следующие действия:
В Браузере проекта создайте новую папку под названием Scripts, как вы создали папку Scenes раньше. Убедитесь, что эта папка выбрана, так как Unity добавляет новый скрипт в выбранную папку.
- Выберите Assets\Create\C# script в верхнем меню и назовите скрипт MouseController.
- Перетащите скрипт MouseController на mouse в Иерархии, чтобы добавить его к объекту игры mouse. Это позволит добавить компонент Script и установить свойства для скрипта MouseController.
Убедитесь, что вы правильно назвали скрипт, в противном случае вы получите следующее сообщение об ошибке при попытке добавить этот скрипт для игрового объекта: Невозможно добавить скрипт поведения MouseController. Имя файла скрипта не соответствует имени класса, определенного в скрипте ! ( Невозможно добавить скрипт поведения MouseController Название файла скрипта не совпадает с именем класса, определенного в сценарии!) Это происходит потому, что Unity создает класс public class NewBehaviourScript
в скрипте, и переименование сценария не изменяет имя класса внутри.
Пришло время написать код. Откройте скрипт MouseController дважды щелкнув на него в Браузере проекта, или в Инспекторе. Это откроет файл MouseController.cs в MonoDevelop. Добавьте публичную переменную jetpackForce
внутри объявления класса:
public float jetpackForce = 75.0f;
Это будет сила, возникающая при включении реактивного ранца и не дающая нашей мышке упасть.
Идея сделать переменную jetpackForce
публичной и задать ей значение по умолчанию очень хороша: так вы можете настроить подъемную силу ракетного ранца в Инспекторе, но при этом у нее будет значение по умолчанию на тот случай, если вы забыли или не хотите задать этой переменной иное значение.
Затем добавьте следующий метод внутри класса:
void FixedUpdate () {
bool jetpackActive = Input.GetButton("Fire1");
if (jetpackActive) {
rigidbody2D.AddForce(new Vector2(0, jetpackForce));
}
}
Метод FixedUpdate
вызывается Unity через равные промежутки времени, величина которых настраиваема. Весь код, связанный с физикой будет написан в этом методе.
Разница между методами Update
и FixedUpdate
в том, что FixedUpdate
вызывается через равные промежутки времени, в то время как Update
вызывается для каждого кадра.
Так как, частота смены кадров может меняться, время между вызовами Update
- методов может также меняться, однако физические движки плохо работают с переменным шагом времени. Вот почему метод FixedUpdate
существует и должен быть использован, чтобы написать код, связанный с моделированием физики (например, применение силы, задание скорости и так далее).
В FixedUpdate
вы проверяете, нажата ли кнопка Fire1. Эта кнопка определяется по умолчанию в Unity как левая кнопкой мыши, левой клавиша Ctrl на клавиатуре, или просто касанием экрана для сенсорного устройства (в нашем случае). Поэтому, если в данный момент нажата Fire1, код применит к мыши подъемную силу. Свойство rigidbody2D просто возвращает компонент Rigidbody 2D, прикрепленный к текущему объекту игры, или null
если компонент отсутствует. Метод AddForce
просто применяет силу к rigidbody. Он принимает Vector2, который определяет направление и величину приложенной силы. You will move the mouse forward later, so right now you only apply the force to move the mouse up with the magnitude of jetpackForce
.
Запустите сцену и удерживайте левую кнопку мыши, чтобы включить ракетный ранец и научить нашу летать)).
Ракетный ранец работает, но есть несколько проблем. Во-первых, в зависимости от вашей точки зрения, то ли ракетный ранец слишком мощный, то ли гравитация слишком слаба. В результате вы легко можете отправить мышь за пределы верхней части экрана. Вместо изменения силы, создаваемой ракетным ранцем, вы можете изменить настройки гравитации всего проекта. При глобальном изменении настроек гравитационного датчика обеспечиваются более приемлемые настройки по умолчанию для использования на экранах iPhone меньшего размера. И, кроме того, разве вам не нравится идея поуправлять гравитацией?:]
Для глобального изменения силы тяжести выберите Edit\Project Settings\Physics 2D. Это откроет настройки Physics 2D проекта в Инспекторе. Найдите поле Gravity (Гравитация) и установите значение Y равным -15.
Запустите сцену снова. Теперь вам должно быть намного проще удерживать мышь на экране игры.
Не волнуйтесь, если вы по-прежнему испытываете трудности по поддержанию мыши в пределах экрана игры. Попробуйте сделать вашу вкладку Game больше, настроить jetpackForce, или гравитацию. Значения, рекомендуемые здесь, хорошо работают, когда вы запустите игру на iPhone. Пол и потолок помогут держать мышь в поле зрения, поэтому давайте добавим их в следующей части урока.