Введение в разработку на Unity
Добро пожаловать на новый курс! Задача данного блока — погрузиться в сферу GameDev, освоить базовые принципы программирования, а также познакомиться с мощным языком C# и передовым игровым движком Unity. Мы начинаем большой путь, впереди нас ждет создание собственных крутых 2D и 3D проектов!

По устоявшейся ИТ-традиции, когда программист только начинает изучение нового языка, его самой первой программой становится вывод на экран или в консоль классического приветствия: «Hello, World!».
На языке C# это приветствие пишется всего одной строкой:
Console.WriteLine("Hello, World!");
Что такое Unity?
Unity — это профессиональная кроссплатформенная среда разработки, созданная американской компанией Unity Technologies. В отличие от простых любительских визуальных конструкторов, этот движок предоставляет полный контроль над кодом, логикой и физикой, позволяя создавать игры студийного качества.
Выпуск Unity состоялся в 2005 году, и с того времени движок непрерывно развивается. Сегодня он позволяет создавать приложения, работающие на более чем 25 различных платформах, включая персональные компьютеры, популярные игровые консоли, мобильные устройства, VR/AR-гарнитуры и интернет-приложения.
Основные преимущества Unity:
- Наличие удобной визуальной среды разработки (редактора).
- Глубокая межплатформенная поддержка (написал один раз — запустил везде).
- Гибкая модульная система компонентов.
К недостаткам обычно относят:
- Появление сложностей при архитектурном планировании очень массивных и многокомпонентных проектов.
- Затруднения при подключении некоторых специфических внешних библиотек.
На Unity написаны тысячи известных игр, полезных приложений и визуализаций математических моделей, охватывающих множество жанров. При этом движок активно используется как крупнейшими мировыми разработчиками, так и независимыми (инди) студиями.

Сегодня мы сделаем первый шаг и начнем знакомство с базовыми инструментами, которые помогут вам создать вашу первую полноценную 2D-игру!
Платформеры
Платформер (англ. platformer, platform game) — жанр компьютерных игр, в которых основу игрового процесса составляют прыжки по платформам, лазанье по лестницам, сбор предметов, необходимых для победы над врагами или завершения уровня.

Платформеры появились в начале 1980-х и стали трёхмерными ближе к концу 1990-х. Через некоторое время после образования жанра у него появилось данное название, отражающее тот факт, что в платформерах геймплей сфокусирован на прыжках по платформам в противовес стрельбе.

.webp)

Шаг №1. Создание проекта
Для удобства управления установленными версиями Unity, а также созданными проектами игр, было разработано специальное стартовое окно — Unity Hub.

Давайте разберем основные разделы левого меню:
- В разделе Projects находятся все ваши созданные проекты игр.
- В разделе Installs находятся все установленные версии редакторов Unity (в рамках курса мы будем работать в версии 6000.0.36f1).
- В разделе Learn собраны различные обучающие материалы, подсказки, гайды и интересные статьи по созданию игр.
- В разделе Community находятся ссылки на полезные ресурсы и сообщества, которые помогут расширить возможности движка.
В разделе Projects нажмите на синюю кнопку New Project, чтобы создать новый проект.

Затем в появившемся окне найдите и выберите шаблон Universal 2D. Именно на его основе мы будем создавать нашу игру. Задайте имя проекта в поле Project Name, например: MyFirstPlatformer, и выберите папку на вашем ПК, где будут храниться все файлы игры (поле Location). После этого нажмите синюю кнопку Create Project.
Далее необходимо немного подождать. Движок создаст базовую файловую структуру для проекта, подтянет необходимые пакеты и загрузит саму среду разработки.

Возможные проблемы
Иногда на этапе создания могут возникать трудности. Вот самые частые из них и способы их решения:
- Отсутствуют шаблоны для создания: Если в окне выбора пусто и нет шаблона Universal 2D, это значит, что на компьютере установлен только Unity Hub, но не установлен сам игровой движок. Вернитесь в раздел Installs левого меню и добавьте нужную версию редактора.

- Предупреждение о правах администратора: Если при запуске появляется системное окно с сообщением, что проект открывается без прав от имени администратора, пугаться не нужно. Просто подтвердите действие, нажав кнопку согласия (например, I wish to continue at my own risk).

Если все шаги выполнены верно, далее необходимо дождаться, когда движок создаст основу для проекта, подтянет необходимые пакеты и загрузит саму среду разработки.
Визуальная среда разработки
После загрузки вас встречает визуальная среда разработки, или, простыми словами, – редактор Unity.

Разберем главное окно по основным элементам:
- Hierarchy (Иерархия): В данной области будет отображаться список всех объектов (спрайтов, платформ, камер), которые в данный момент расположены на сцене.
- Scene (Сцена): Основное визуальное окно, где отображаются добавленные в проект объекты. Именно на сцене вы будете строить карту игры, а также располагать всех игровых и неигровых персонажей.
- Project (Проект): Файловый менеджер игры. Это список всех объектов, которые хранятся в папке проекта на компьютере, включая даже неиспользованные текстуры, все созданные скрипты и анимации.
- Inspector (Инспектор): Окно свойств выбранного объекта. Через данное окно объектам будут назначаться все новые компоненты, физические поведения и скрипты.
Шаг №2. Организация файлов проекта
Создайте в корневой папке Assets (в окне Project) несколько новых папок для грамотной организации файлов проекта. Порядок — залог успешной разработки! Для этого:
- В окне Project убедитесь, что вы открыли корневую папку Assets.
- Кликните правой кнопкой мыши по любому свободному месту в этом окне.
- В появившемся контекстном меню наведите курсор на пункт Create (Создать), а затем выберите Folder (Папка).

- Sprites – для изображений персонажей, предметов и окружения.
- Scripts – для хранения файлов с программным кодом и логикой.

После создания папок в Unity. Визуальная среда разработки автоматически обновится, и в окне Project появятся ваши новые папки.
Далее добавьте в созданную папку Sprites необходимые для работы графические объекты — ассеты. Перед тем как переносить файлы в Unity, скачанный архив необходимо обязательно разархивировать (извлечь файлы в обычную папку). Игровой движок не умеет корректно импортировать графику напрямую из запакованных архивов.

После извлечения просто выделите полученные папки на вашем компьютере и перетащите их мышкой прямо внутрь папки Sprites в окне Project (такой способ переноса элементов называется Drag-and-Drop). При переносе файлов потребуется немного подождать. В Unity появится окно загрузки (Importing), и только после её завершения можно будет продолжить работу.
Обратите внимание: тяжелые ассеты или большое количество файлов могут загружаться довольно долго. Если процесс визуально замер, это не значит, что Unity завис — просто дайте движку время обработать и пережать все новые ресурсы.
После успешного переноса всех нужных ассетов, папка Sprites должна выглядеть следующим образом:

Внутри будут находиться удобные подпапки:
В папке Backgrounds хранятся все игровые фоны.
В папке Enemies хранятся спрайты врагов.
В папке Environment хранится все игровое окружение, в том числе платформы.
В папке Players хранятся спрайты главного героя.
Шаг №3. Построение уровня
Из папки Backgrounds выберите понравившийся фон и, зажав левую кнопку мыши (ЛКМ), перенесите его на сцену.
Также стоит включить вид от лица камеры, чтобы видеть, как будет отображаться наш уровень в самой игре и все объекты находились внутри камеры.

Чтобы разместить изображение ровно по сетке и в дальнейшем состыковать оставшиеся части фона между собой, зажмите правую кнопку мыши (ПКМ) на объекте и во всплывающем меню выберите Move to the Grid Position. Среда автоматически подтянет изображение к ближайшему узлу сетки.

Для того чтобы продублировать уже расположенную на сцене часть фона еще раз, воспользуйтесь горячей клавишей Ctrl + D (продублировать). Таким образом на сцене появится копия объекта, а в списке объектов Hierarchy добавится еще одна строка. Созданная копия появляется ровно в том же самом месте, поверх оригинала. Чтобы разместить её рядом, просто зажмите объект левой кнопкой мыши и начните двигать в нужную сторону.
Разместите дополнительные копии частей фона так, чтобы полностью закрыть пустое пространство в пределах белого прямоугольника (границ камеры).

Для того чтобы изменить имя, необходимо кликнуть в списке на нужный спрайт правой кнопкой мыши (ПКМ) и выбрать пункт Rename.

Пришло время разместить первые платформы ! Абсолютно аналогично работе с фоном, путем перетаскивания из папки Environment проекта, размещаем на сцене платформу.

Как только вы перенесете платформу на сцену, вы можете столкнуться с неожиданной проблемой: она может оказаться спрятанной под фоном. Чтобы исправить этот момент и вынести платформу на передний план, нам потребуется изучить свойства объектов.
Шаг №4. Окно Inspector
Выберите платформу в окне Hierarchy или прямо на сцене и обратите внимание на правую часть экрана — панель Inspector. Именно здесь настраиваются все уникальные параметры выделенного элемента.

В данном окне необходимо найти компонент Sprite Renderer, который отвечает за визуальное отображение спрайта в игре. Внутри этого раздела (иногда в выпадающем меню Additional Settings — дополнительные настройки) найдите параметр Order in Layer (позиция на слое). Для платформы нужно указать позицию 1.
Чтобы выстроить правильную логику перекрытия, задайте следующие значения:
- У фоновых изображений укажите позицию 0 (они должны быть позади всего).
- У платформ и элементов окружения установите позицию 1.
- У главного героя позиция должна быть 2 (или выше), чтобы он всегда отображался поверх платформ и фона.
Закрепление знаний
Проверьте, как вы усвоили данную тему, и потренируйтесь в самостоятельном размещении платформ на карте. Также добавьте на сцену главного героя!
Обязательно соблюдайте порядок и не забывайте менять имена в панели Hierarchy, чтобы не запутаться в собственных объектах при дальнейшем расширении уровня.
Рекомендуемые имена для объектов:
Для фона: Background_№
Для платформ: Platforma_№
Для персонажа: MainHero

Шаг №5. Добавление физики и столкновений
Теперь добавим новые свойства игровым объектам, чтобы они перестали быть просто картинками на сцене и обрели физические границы. Выберите платформу и обратите внимание на окно Inspector. Найдите в самом низу окна кнопку Add Component и нажмите по ней ЛКМ.
.png)
В появившемся меню поиска введите BoxCollider2D и выберите данный компонент.

Если все сделано верно, то в окне Inspector ниже компонента Sprite Renderer появится добавленный BoxCollider2D.

Теперь аналогичным образом добавьте компонент BoxCollider2D для главного героя. После этого добавьте герою еще один важнейший компонент — Rigidbody2D.

После того как все объекты размещены и свойства заданы, можно проверить, как именно будет видеть ваш проект пользователь! Для этого в верхней части экрана, рядом со вкладкой Scene, выберите вкладку Game.

Практическое творческое задание
Потренируйтесь в расстановке объектов на сцене. Выберите из папки Environment дополнительные элементы окружения, разместите их и обязательно добавьте им необходимые физические компоненты.

Шаг №6. Первый скрипт
Теперь добавим логику, которая «оживит» главного героя и заставит его реагировать на нажатия клавиш. Программирование в Unity осуществляется на языке C#.
В окне Project откройте ранее созданную папку Scripts. Нажмите правую кнопку мыши (ПКМ) по пустому месту, наведите курсор на Create, после наводим на Scripting и выберите Empty C# Script.

Для написания кода существуют специальные тяжелые среды (IDE, например, Visual Studio), но для лучшего понимания работы скриптов мы воспользуемся простым текстовым редактором. Нажмите ПКМ по созданному файлу PlayerMovement.cs и выберите Show in Explorer (Показать в проводнике).

В открывшейся папке кликните по файлу правой кнопкой мыши и выберите Открыть с помощью -> Блокнот (или воспользуйтесь более удобным редактором Notepad++, если он установлен).
Удалите всё, что Unity сгенерировал по умолчанию. Сначала мы подготовим пустую структуру (скелет) нашего будущего скрипта. Перепишите этот код:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
// Здесь будут храниться переменные
private void Awake()
{
// Вызывается один раз при появлении объекта
}
private void Update()
{
// Вызывается каждый кадр (здесь обрабатываем прыжок)
}
private void FixedUpdate()
{
// Вызывается с фиксированным интервалом (здесь обрабатываем движение)
}
}
Теперь давайте заполнять наш скелет по частям. В самом верху кода мы подключили библиотеку UnityEngine.InputSystem, которая позволит нам считывать нажатия с клавиатуры.
Сначала добавим переменные внутри класса. Они нужны для хранения настроек скорости и силы прыжка, а также для получения доступа к физике героя. Добавьте следующие строки:
2
3
4
5
6
7
8
9
10
11
12
...
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
private Rigidbody2D rb;
private void Awake()
{
...
}
Разберем написанные строки:
public float moveSpeed = 5f;— создает публичную (открытую) дробную переменную для хранения скорости бега и задает ей начальное значение 5.public float jumpForce = 10f;— публичная переменная для силы прыжка (значение 10). Модификатор public означает, что мы сможем менять скорость и силу прыжка прямо в окне Inspector в Unity, не открывая код заново.private Rigidbody2D rb;— создает скрытую (приватную) переменнуюrb, в которую мы чуть позже сохраним компонент физики.
2
3
4
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
Разберем эту команду:
rb = ...— обращаемся к нашей пустой переменнойrb.GetComponent<Rigidbody2D>();— специальная команда Unity, которая ищет на нашем персонаже прикрепленный компонентRigidbody2Dи сохраняет доступ к нему внутрь переменнойrb. Теперь черезrbмы можем управлять гравитацией и скоростью!
Теперь научим персонажа прыгать. Для этого используется функция Update, которая работает постоянно, каждый кадр игры.
2
3
4
5
6
7
8
9
private void Update()
{
if (Keyboard.current == null) return;
if (Keyboard.current.spaceKey.wasPressedThisFrame && Mathf.Abs(rb.linearVelocity.y) < 0.001f)
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);
}
}
Разберем логику прыжка:
if (Keyboard.current == null) return;— защитная строка. Если клавиатура не подключена, мы просто прерываем функцию (return), чтобы игра не выдала ошибку.if (Keyboard.current.spaceKey.wasPressedThisFrame— проверяем условие: была ли нажата кнопка Пробел (Space) в текущем кадре.&& Mathf.Abs(rb.linearVelocity.y) < 0.001f)— и (&&) проверяем, что текущая вертикальная скорость героя (linearVelocity.y) почти равна нулю. Это нужно, чтобы герой не мог бесконечно прыгать прямо в воздухе!rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);— если оба условия верны, мы задаем телу новую скорость. Скорость по горизонтали (x) оставляем как есть, а по вертикали (y) передаем нашу силу прыжкаjumpForce.
2
3
4
5
6
7
8
9
10
11
private void FixedUpdate()
{
if (Keyboard.current == null) return;
float moveInput = 0f;
if (Keyboard.current.leftArrowKey.isPressed) moveInput = -1f;
if (Keyboard.current.rightArrowKey.isPressed) moveInput = 1f;
rb.linearVelocity = new Vector2(moveInput * moveSpeed, rb.linearVelocity.y);
}
Разберем физику движения:
float moveInput = 0f;— создаем временную переменную направления и задаем ей 0 (персонаж стоит на месте).if (Keyboard.current.leftArrowKey.isPressed) moveInput = -1f;— если зажата стрелочка влево, меняем направление на -1.if (Keyboard.current.rightArrowKey.isPressed) moveInput = 1f;— если зажата стрелочка вправо, меняем направление на 1.rb.linearVelocity = new Vector2(moveInput * moveSpeed, rb.linearVelocity.y);— рассчитываем итоговую скорость. По горизонтали (x) умножаем направление на скорость бега (moveSpeed), а по вертикали (y) сохраняем текущее падение или прыжок.
Сохраните файл в вашем текстовом редакторе (Ctrl + S) и вернитесь в Unity. Среда автоматически скомпилирует написанный вами код (появится значок загрузки).
Скрипт полностью готов! Теперь его нужно «прикрепить» к главному герою. Выделите вашего героя в панели Hierarchy, схватите скрипт PlayerMovement из папки Scripts и перетащите его прямо в окно Inspector героя.

После этого скрипт будет привязан к персонажу как новый компонент. Обратите внимание на окно Inspector: в самом низу теперь появились поля Move Speed и Jump Force. Благодаря тому, что в коде мы сделали эти переменные публичными (public), вы можете менять скорость бега и силу прыжка прямо здесь, не открывая текстовый редактор заново!
Запустите игру (кнопка Play сверху по центру) и попробуйте подвигаться по уровню с помощью стрелочек и пробела! Скорректируйте значения скорости и прыжка в Инспекторе так, чтобы управление ощущалось максимально комфортно.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
private Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
if (Keyboard.current == null) return;
if (Keyboard.current.spaceKey.wasPressedThisFrame && Mathf.Abs(rb.linearVelocity.y) < 0.001f)
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);
}
}
private void FixedUpdate()
{
if (Keyboard.current == null) return;
float moveInput = 0f;
if (Keyboard.current.leftArrowKey.isPressed) moveInput = -1f;
if (Keyboard.current.rightArrowKey.isPressed) moveInput = 1f;
rb.linearVelocity = new Vector2(moveInput * moveSpeed, rb.linearVelocity.y);
}
}