Ссылки
Разница между 2D и 3D
Unity поддерживает разработку 2D-игр, и для удобства процесса разработки перед созданием нового проекта он может быть определен как 2D.
Переключение режима разработки в уже созданном проекте осуществляется через меню Edit – ProjectSettings–Editor–DefaultBehaviorMode–Mode.
В 2D-режиме Unity вносит некоторые изменения в настройки редактора:
- Окно сцены по умолчанию включено в 2D-режиме (если необходимо, данная настройка легко переключается обратно в 3D-режим с помощью переключателя в верхней части окна сцены). Эта настройка независима от остальных настроек 2D-режима и может быть изменена в любое время.
- Свойство «Projection» камеры по умолчанию установлено в «Orthographic», а «Size» равно.
- При импорте новых изображении их Texture Type по умолчанию установлен в «Sprite (2D\uGUI)».
Компоненты 2D-объектов
Рассмотрим некоторые компоненты и события 2D-объектов и их отличия от компонентов и событий,использующихся для 3D-объектов.
Компоненты
BoxCollider2D –это прямоугольный коллайдер, используемый при работе с 2D физикой.
2D коллайдер/триггер обрабатывает события (сталкивание, пересечение и т.д.) независимо от того, где он располагается по координате Z. Все свойства коллайдера точно такие же, как и у BoxCollider, за исключением одного. Переключатель Used By Effector отвечает за то, используется ли данный коллайдер прикрепленным компонентом – Effector 2D (данные компонент бывает разного типа: точка, область, платформа и т.д.).
- Material – физический материал, который определяет свойства столкновений, такие как трение и отскок.
- IsTrigger – является ли коллайдер триггером?
- Used by Effector – используется ли данный коллайдер прикрепленным компонентом – Effector.
- Auto Tiling – установите этот флажок, если компонент Sprite Renderer установлен в режим Tile. Это позволит автоматически, обновлять форму коллайдера, которая будет корректироваться по форме спрайта.
- Offset – локальное смещение геометрии коллайдера.
- Size – ширина и высота прямоугольника в единицах локального пространства.
- Edge Radius – смягчает грани, делая коллайдер более круглым, по умолчанию значение равно
- Info – общая информация о состоянии коллайдера.
Визуальное отображение пустых объектов с 2D- и 3D-коллайдерами при включении 3D-режима в окне сцены:
Rigidbody2D – компонент помещает объект под контроль физического движка. В целом компонент похож на Rigidbody, но объект может двигаться только в плоскость XY, а вращаться только перпендикулярно этой плоскости.
Отличительные свойства:
- UseAutoMass – рассчитать массу автоматически,исходя из коллайдера;
- GravityScale – как гравитация воздействует на объект;
- Sleeping Mode – режим, когда объект выключается из физической симуляции (в целях оптимизации).
- Never Sleep – всегда активен (необходимо стараться избегать данного режима);
- Start Awake – активен при запуске (режим включен по умолчанию);
- Start Asleep – не активен при запуске, но может быть разбужен (столкновением или через скрипт).
Спрайты
Настройки спрайта (Import Settings)
После импорта изображения в проект в 2D-режиме разработки его настройки по умолчанию выглядят следующим образом:
- В верхней части находится иконка – превью спрайта (также превью находится в нижней части инспектора), отображается название файла, кнопка Open, которая открывает изображение в программе просмотра изображений, установленной в системе по умолчанию.
- Texture Type – устанавливает базовые параметры в зависимости от предназначения текстуры(изображения).
- Sprite Mode – устанавливает, в каком режиме спрайт будет извлекаться из изображения, как один спрайт (Single) или как несколько раздельных спрайтов (Multiple). Второй режим может использоваться для импорта спрайтов как кадров анимации, а также как несколько спрайтов, относящихся к одному объекту. Третий режим Polygon позволяет настраивать форму, размер и pivot point для вашего спрайта.
- PackingTag – имя атласа, в который данное изображение должно быть запаковано.
- Pixels Per Unit – количество пикселей в изображении спрайта, которые соответствуют одному юниту (внутренняя единица измерения в Unity).
Компонент Sprite Renderer
Данный компонент позволяет отображать спрайты и используется как в 2D, так и в3D-сценах.
Компонент имеет следующие свойства:
- Sprite – спрайт.
- Color – цвет.
- Flip – отражение спрайта по оси X или Y.
- Material – материал, стандартные шейдеры, которые используют для материала спрайта – Sprites/Default (не взаимодействует с освещением на сцене), Sprites/Diffuse (взаимодействует с освещением на сцене).
- Draw Mode – выберите параметр из списка Draw Mode, чтобы определить, как масштабируется спрайт при изменении его параметров.
- Simple – это значение по умолчанию. Изображение изменяется во всех направлениях,когда его размеры меняются.
- Sliced – применяйте это, если хотите нарезать спрайт на 9 частей, чтобы эти части можно было растягивать. В этом режиме углы остаются одинаковыми, верхняя и нижняя часть тянутся в собственную высоту, а центр тянется в ширину и высоту.
- Size – используйте это значение, чтобы изменить горизонтальный и вертикальный размер спрайта. Если вы хотите, чтобы slice работала корректно, вам нужно настроить это значение. Компонент Transform применяется только по умолчанию.
- Tiled – применяйте это если хотите нарезать спрайт на 9 частей, чтобы эти части можно было повторять. В этом режиме углы остаются одинаковыми, верхняя и нижняя часть тянутся в собственную высоту, а центр тянется в ширину и высоту.
Sprite Creator
С помощью этого инструмента можно создавать временные заменители спрайтов. Их можно использовать в проекте в процессе разработки, а затем, когда будет создана необходимая графика, заменить. Для создания таких спрайтов необходимо выбрать меню Assets – Create – Sprites, далее один из доступных типов спрайтов: Square, Triangle, Diamond, Hexagon, Circle, Polygon.
Через меню Assets – Create создаются не объекты, а ассеты, поэтому после создания спрайта в папке проекта появляется новый ассет, а на сцене ничего не изменяется. Далее необходимо добавить созданный спрайт на сцену.
Спрайты в окне проекта:
Спрайты на сцене:
При создании спрайта Polygon открывается Sprite Editor, где можно изменить форму спрайта и некоторые его параметры. Далее более подробно об этом редакторе.
Sprite Editor
Чаще всего спрайт – это одно изображение, но иногда спрайт содержит несколько элементов, которые каким-либо образом связаны друг с другом и объединены в одно изображение. Для работы с такими спрайтами в Unity есть специальный редактор.
Если для спрайта установлен режиме Sprite Mode – Single, часть функций редактора недоступна, и он выглядит следующим образом:
В режиме SpriteMode – Multiple:
SpritePacker
При работе со спрайтовой графикой очень важно при работе с разными персонажами работать с разными файлами текстур. Однако, значительное пространство спрайтовой текстуры будет уходить на пустые участки между графическими элементами, результатом чего станет бесполезный расход памяти при работе игры или приложения. Для достижения оптимальной производительности лучше всего будет упаковывать графические элементы из нескольких спрайтовых текстур как можно плотнее в одну текстуру, именуемую атласом. В Unity есть утилита Sprite Packer, предназначенная как раз для создания таких атласов из набора отдельных текстур.
Необходимо указывать Packing Tag в настройках текстуры, чтобы включить упаковку спрайтов для данной текстуры.
По умолчанию упаковщик спрайтов отключён, но его работу можно настроить через настройки редактора Edit->Project Settings->Editor. Метод упаковывания спрайтов можно установить в состояние Enabled for Builds (упаковывание будет работать для сборок, но не в режиме Play) или в состояние Always Enabled (упаковывание будет работать и во время сборки и в режиме Play).
Указав для нескольких текстур (спрайтов) одинаковый Packing Tag, можно открыть Windows – SpritePacker, нажать кнопку Pack и посмотреть расположение текстур в атласе.
Если выбрать спрайт в окне проекта, он подсветится, чтобы показать своё местоположение на атласе. Видимый контур представляет собой контур самого меша, а также показывает область, которая будет использована для плотной упаковки.
Инструменты в верхней части окна упаковщика спрайтов:
- Pack – инициализирует операцию упаковывания.
- Repack – переупаковка атласа (обновление).
- View Atlas – атлас, который необходимо отобразить в окне (если при максимальном размере текстуры в неё не помещаются все спрайты, атлас может быть разбит на множество страниц).
- Page – позволят выбрать страницу атласа, которую необходимо отобразить в окне.
- Меню, следующее за номером страницы – выбор правил упаковывания использующиеся для текущего атласа.
Упаковщик спрайтов использует правила упаковки, чтобы определять, как применять спрайты к атласам. Можно создавать и свои собственные правила упаковки.
Атласы кешируются в Project\Library\AtlasCache. Удаление этой папки и последующий запуск Unity приведёт к принудительной перепаковке всех атласов. Во время удаления Unity необходимо закрыть. Максимальный размер атласа по умолчанию равен 2048х2048. При назначенном свойстве PackingTag текстуры не будут сжиматься, чтобы упаковщик спрайтов мог использовать оригинальные значения пикселей при сжатии атласов.
Понятие FPS
FPS – аббревиатура от Frames Per Second, что в переводе на русский означает количество кадров в секунду. Видео – это процесс смены статических кадров. Каждый кадр – это статическое изображение. Количество кадров в секунду – это скорость смены изображений.
В компьютерной игре используется визуализация на основе рендеринга. То есть каждая картинка кадра визуализируется за счет программно-аппаратных алгоритмов на основе действий игрока.
Человеческий глаз способен воспринимать смену картинок, как видео при смене не менее 25-30 кадров в секунду.
Чем качественнее каждая картинка в кадре, тем больше ресурсов компьютера нужно для ее рендеринга и чем больше логических операций в коде, тем больше ресурсов процессора нам потребуется, чтобы выполнить кадр, а соответственно потребуется больше времени на подготовку следующего кадра, таким образом показатель FPS будет уменьшаться, что приведет к нестабильной работе нашей программы.
Чем ниже показатель FPS, тем меньше кадров для логики. В этих самых кадрах и происходит наша игровая логика, поэтому задача программиста оптимизировать работу каждого кадра.
Основные методы класса MonoBehaviour
MonoBehaviour – класс, на базе которого (наследуются) по умолчанию создаются все скрипты в Unity. Скрипты создаются через контекстное меню в окне проекта, через меню Component на верхней панели инструментов, при помощи кнопки Add Component в окне инспектора (когда выделен какой-либо объект). Скрипт работает только тогда, когда он является компонентом объекта на сцене, причём некоторые функции (методы) скрипта могут срабатывать даже тогда, когда сам скрипт выключен(неактивен).
Для редактирования скрипта после его создания необходимо дважды нажать на него ЛКМ в окне инспектора или в окне проекта. Скрипт откроется в той среде разработки, которая указана в настройках Editor–>Preferences–>External Tools–>External Script Editor (обычно это Visual Studio или MonoDevelop). Там же можно сменить среду разработки.
Имя класса в скрипте должно совпадать с именем файла (это происходит автоматически, при создании файла). По умолчанию в скрипте создаются две функции (метода) – Start() и Update(), но существуют и другие функций, которые могут быть использованы как унаследованные от MonoBehaviour. Так же можно создавать свои функции.
По умолчанию скрипт выглядит следующим образом:
using System.Collections;
using UnityEngine;
public class MyFirstScript : MonoBehaviour
{
private void Start()
{
}
private void Update()
{
}
}
Awake()
Функция, которая вызывается один раз при запуске игры до функции Start(). Вызывается в случайном порядке среди объектов на сцене, для которых она реализована. Функция срабатывает даже тогда, когда скрипт не активен.
Start()
Функция, которая также вызывается один раз, но в тот момент, когда скрипт становится активным. Вызывается перед функций FixedUpdate(),Update()ит.д.
FixedUpdate()
Функция, которая выполняется каждый фиксированный отрезок времени. Можно настроить в Edit–>Project Settings–>Time – Fixed Time step. Используется для обработки физики (приложения силы, импульса к объект у и т.д.)
Update()
Функция, которая выполняется каждый кадр. Используется для обработки игровой логики.
Для того, чтобы реализовать выполнения какой-либо действия с определенной частотой, например, раз в секунду,используют Time.deltaTime * 1
.
deltaTime – время (в секундах), прошедшее с последнего кадра. Это значением позволяет сделать игру независимой от скорости смены кадров.
LateUpdate()
Функция, которая выполняется каждый кадр. Вызывается после того, как все Update() функции будут вызваны. Используется для того, чтобы упорядочить выполнения действий в скрипте. Например, если камера следует за объектом, движение которого реализовано в Update() функции.
Практика
Рассмотрим проект на примере 2D Platformer'a от UnityTech.
Давайте разберем, из чего состоит основа геймплея 2DPlatformer'a.
Самым важным объектом является игрок, поэтому с него мы и начнём.
Итак, наш персонаж состоит из множества компонентов, основным из них является Player Control, который позволяет нам перемещаться, прыгать и даже издавать звуки. Этот компонент завязан на анимации и физике поэтому, чтобы его использовать, нам понадобится добавить аниматора и физические компоненты.
Аниматор - позволит нам анимировать нашего героя.
Rigidbody позволит физически взаимодействовать с препятствиями, а чтобы мы не проваливались под пол и фиксировать столкновения с препятствиями, нам понадобится Box Collider2D.
При добавлении данных компонентов на наш спрайт мы с вами уже получили подвижного персонажа, с которым можно работать дальше.
На основной демонстрационной сцене есть куча разных объектов, которые могут нам пригодиться для создания своей игры, их можно найти, если вы выберете нужный объект и найдёте на компоненте sprite renderer поле sprite, кликнув на него, редактор покажет, где у вас в проекте лежит данный объект.
Теперь можно расставлять объекты на сцене, просто перетаскивая их из окна Project. Буквально за несколько движений мы с вами уже сделали свой уровень с персонажем.
Главное, не забыть положить нашему персонажу объект groundCheck в иерархии, как дочерний, чтобы мы могли прыгать и указать всем балкам, что они лежать на слое Ground, не забывая о коллайдерах.
Практическое задание
** Проект 1 (Используя готовый проект собрать свой игровой уровень)
- Скачать несколько бесплатных ассетов и собрать свой уровень.
- Заменить спрайт персонажа на свой.
- Собрать свою сцену на основе 2D-платформера, чтобы противники спаунились и их можно было убивать.
Проект 2 (Используя графику, анимации, звуки реализовать простейший раннер)
Необходимо используя имеющиеся в прошлом проекте ресурсы, переделать игровую логику так, чтобы главной задачей персонажа было добежать от левого края игровой сцены до правой.
- Написать\модифицировать скрипт контроллера (передвижение). Персонаж бежит сам. От игрока требуется только прыгать над противниками. В случае падения в воду и столкновения с противником – умирать.
- Персонаж находится в середине экрана. Камера следует за персонажем.
- В случае смерти игрок стартует сначала со стартовой точки.
- В случае успеха игрок переносится в стартовую точку.
- Реализовать спаунер (место от куда они появляются)противников. Противники должны передвигаться в пределах одной платформы.
- Размер игрового окна – 1366x768.
- Примеры похожих игр: BeatRush (ios, Android), GeometryDash (ios, Android, Steam) и другие. Поиграйте, изучите как работают игры такого типа.
Примерное изображение игрового уровня: