Добро пожаловать в твой первый туториал по Unity 2D. Мы шаг за шагом оживим простую игру с ловлей предметов. Опыт работы с Unity не нужен — просто установи Unity 6.0 LTS (или любую другую версию с поддержкой 2D) — и вперёд! Поиграй с настройками, нажми Play и смотри, как оживает твоё творение. Готов нырнуть? Поехали!
Запусти Unity Hub и создай новый 2D-проект, используя шаблон Universal 2D Core — это будет чистая и удобная основа.
Открой Unity Hub → вкладка Projects →
New Project. Выбери шаблон
Universal 2D Core (в нём уже есть базовая 2D-графика,
шейдеры и физика). В зависимости от версии Unity название шаблона
может немного отличаться — если нужного варианта нет, выбери
2D (URP) или обычный 2D. В поле имени проекта введи
CatchGame
(или придумай своё название и выбери папку).
Нажми Create project и подожди, пока Unity всё
подготовит.
💡 Совет: сразу выбери понятное имя и папку — это сэкономит время, когда проект станет больше.
Когда откроется Unity Editor, нас будут интересовать такие панели:
Для этой игры понадобятся четыре изображения: земля, ловец, хороший предмет и плохой предмет.
Ты можешь скачать готовую картинку, на которой все они уже нарисованы. Это просто отправная точка — потом ты легко сможешь улучшить или заменить изображения.
Чтобы импортировать изображение в Unity: кликни правой кнопкой в окне Assets, выбери Import New Asset..., найди скачанный файл и нажми Import.
💡 Совет: ты можешь просто перетащить файл с изображением прямо в окно
Assets — так даже быстрее.
💡 Совет: начни с простого — графику всегда можно доработать позже.
После того как ты импортировал изображение
catchgame-img.png
, Unity обычно автоматически
устанавливает режим Sprite Mode: Multiple. Но лучше
проверить это вручную.
Почему Multiple? Это спрайтовый лист — в одном изображении собрано сразу несколько игровых элементов (земля, ловец, предметы). Разрезав его, ты получишь отдельные спрайты, которые можно перетаскивать в сцену.
Выдели изображение в папке Assets. В
Inspector убедись, что
Sprite Mode установлен в значение Multiple
. Если
нет — установи вручную и нажми Apply.
Теперь открой Sprite Editor из инспектора. В открывшемся окне нажми Slice в левом верхнем углу. Оставь настройки по умолчанию и снова нажми Slice, затем Apply.
Unity автоматически нарежет изображение на отдельные спрайты. Обычно он делает это довольно точно. Если нужно — ты можешь вручную подправить границы, перетаскивая их прямо в Sprite Editor.
💡 Совет: хочешь использовать собственные картинки? Вместо одного листа ты можешь импортировать четыре отдельных изображения. Просто кликни правой кнопкой в окне Assets, выбери Import New Asset..., укажи файлы и нажми Import.
💡 Совет: можно просто перетащить файлы с изображениями прямо в окно Assets — Unity всё подхватит автоматически.
Пора добавить землю в сцену. В папке Assets найди
спрайт земли (например, catchgame-img_3
) и перетащи его в
окно Scene.
Убедись, что выбран инструмент Rectangle Tool, и растяни спрайт по ширине внизу сцены. Можешь подогнать границы, потянув мышкой.
В Hierarchy кликни правой кнопкой по объекту
(например, catchgame-img_3
) и переименуй его в
Ground
. Затем в Inspector установи
Order in Layer
на 100
. Это гарантирует, что
земля будет отрисована поверх других объектов — словно в верхнем слое.
-1
),
чтобы спрятать объект "позади".
Нажми Play, чтобы протестировать сцену — земля должна быть видна внизу. Затем снова нажми Play, чтобы вернуться в режим редактирования.
Сейчас земля видна в сцене — но она ещё не «твёрдая». Остальные объекты просто провалятся сквозь неё, потому что у неё нет коллайдера.
Давай это исправим. Выдели объект Ground в Hierarchy, затем в Inspector нажми Add Component → Physics 2D → Box Collider 2D. Это добавит физическую форму, с которой другие объекты смогут взаимодействовать.
Добавим в сцену ловца — нашего игрока. Почти всё будет похоже на то, что мы делали с землёй.
XC-catchgame-img_2
) в
папке Assets и перетащи его в окно
Scene.
Player
.
Player
нажми Add Component →
Physics 2D → Box Collider 2D.
Теперь добавим компонент Rigidbody 2D, чтобы игрок реагировал на гравитацию и физику.
Оставив Player
выбранным, снова нажми
Add Component и выбери Rigidbody 2D. В его
настройках установи Interpolate в значение
Interpolate
— это сделает движение более плавным.
Ещё можно сразу назначить тег для игрока — это пригодится в скриптах.
В Inspector установи тег
Player
(возможно, его сначала нужно создать в Tag
Manager).
Значение Order in Layer
можешь оставить на
0
— пока этого достаточно.
Нажми Play — игрок должен упасть и встать на землю. Нажми ещё раз, чтобы вернуться к редактированию.
Теперь дадим игроку возможность двигаться! Мы создадим простой скрипт
на C#, который будет управлять скоростью Rigidbody2D
в
зависимости от клавиш.
В папке Assets кликни правой кнопкой и выбери
Create → MonoBehaviour Script. Назови его PlayerMove
(с заглавными P и M). Обрати
внимание: имя файла и класса должны совпадать.
PlayerMove
и
нажать Create and Add.
Открой файл PlayerMove.cs
. Сначала в нём будет шаблон —
мы заменим его на этот код:
Start()
— запускается один раз в начале.Update()
— каждый кадр (здесь не нужен).FixedUpdate()
— с фиксированным интервалом (по умолчанию
0.02 сек), используется для физики.
"Horizontal"
возвращает значение от -1 (влево, A) до 1
(вправо, D). Эти значения мы используем для расчёта движения.
Vector2
(или Vector3
в 3D),
определяющий скорость и направление. Изменяя скорость
Rigidbody2D
, мы двигаем объект.
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
// Скорость игрока (можно задать в Inspector)
public float speed = 5f;
// Rigidbody2D компонента
private Rigidbody2D rb;
// Значение оси по горизонтали (A/D или стрелки)
private float x;
// Движение, которое мы применим
private Vector2 move;
// Вызывается в начале
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
// Вызывается каждую физическую итерацию
void FixedUpdate()
{
// Получаем ввод с клавиатуры (влево/вправо)
x = Input.GetAxis("Horizontal");
// Двигаем вбок, но сохраняем скорость падения
move = new Vector2(x * speed, rb.linearVelocity.y);
// Применяем движение к игроку
rb.linearVelocity = move;
}
}
Вернись в Unity. Выдели Player в Hierarchy. В Inspector нажми Add Component → Scripts → PlayerMove.
PlayerMove
из папки
Assets в Inspector, когда выбран объект игрока.
Установи значение Speed в инспекторе, например
5
.
Нажми Play и попробуй управлять игроком с помощью клавиш A/D или стрелок. Потом снова нажми Play, чтобы вернуться в режим редактирования.
Давай теперь добавим что-то, что игрок сможет ловить! Начнём с одного падающего объекта — рыбы. Позже мы будем использовать её как шаблон для генерации других экземпляров.
Fish
.
Good
. Если такого тега нет, выбери Untagged →
Add Tag, создай новый тег Good
, а
потом снова выбери его у объекта.
5
, чтобы
рыба отрисовывалась выше, чем игрок.
0.1
и
Interpolate в Interpolate
— для
плавного движения.
Чтобы рыба не оставалась в сцене навсегда, если её не поймали, добавим скрипт для автоматического удаления через несколько секунд.
TimeDestroyer
.
using UnityEngine;
public class TimeDestroyer : MonoBehaviour
{
// Сколько секунд объект будет жить
public float aliveTimer = 5f;
// Вызывается при запуске
void Start()
{
Destroy(gameObject, aliveTimer);
}
}
Прикрепи скрипт к объекту Fish (Add Component →
Scripts → TimeDestroyer). В инспекторе укажи
Alive Timer = 5
.
Теперь сделаем из рыбы Prefab, чтобы потом можно было легко создавать копии.
Чтобы создать префаб, перетащи объект Fish
из
Hierarchy в папку Assets. Unity
создаст синий значок префаба.
У нас есть хороший предмет — рыба. Теперь создадим плохой — бомбу, которую нужно избегать. Мы просто используем префаб рыбы и немного его изменим.
Fish
в сцене и переименуй его
в Bomb
.
Bad
.
Bad
ещё нет:
Bad
Bomb
из Hierarchy в
Assets, чтобы создать новый префаб.
Bomb
из сцены — позже мы
будем спавнить его из префаба.
Bad
,
сохранён как префаб.
Добавим движение сверху. На этом шаге мы создадим простой генератор предметов — он будет «ронять» случайные объекты (например, рыбу или бомбу) сверху вниз.
Начнём с размещения двух невидимых объектов — они обозначат зону появления. Один слева, один справа — между ними и будут появляться предметы.
В Hierarchy кликни правой кнопкой и выбери
Create Empty. Убедись, что перед этим ничего не выбрано —
иначе Unity может сделать новый объект дочерним. Назови его
Spawner
и подними чуть выше камеры, слева.
Скопируй объект (правый клик → Duplicate), перемести копию
направо и переименуй в RightSide
. Эти два объекта зададут
границы зоны появления.
Выдели Spawner
и в Inspector проверь,
что его координата Z = 0
. Так он точно окажется в зоне
видимости камеры. Можешь также задать иконки, чтобы легче
ориентироваться в сцене.
Теперь создадим скрипт. В папке Assets правый клик →
Create → MonoBehaviour Script, назови его ItemSpawn
и прикрепи к объекту
Spawner
.
Скрипт будет выбирать случайное положение между Spawner
и
RightSide
по X, использовать Y координату самого Spawner,
и порождать там случайный объект из списка.
💡 Совет: несмотря на то, что мы работаем в 2D, Unity использует трёхмерное пространство. Камера по умолчанию находится на Z = -10, поэтому все объекты должны быть на Z = 0 (или ближе), чтобы быть видимыми.
using UnityEngine;
public class ItemSpawn : MonoBehaviour
{
// Правая граница зоны появления
public GameObject RightSide;
// Список префабов (рыба, бомба и др.)
public GameObject[] items;
// Задержка перед первым объектом и интервал между остальными
public float startDelay, repeatRate;
void Start()
{
// Повторно вызываем Spawn() с интервалом
InvokeRepeating("Spawn", startDelay, repeatRate);
}
void Spawn()
{
// Случайная позиция между Spawner и RightSide по X
Vector3 pos = new Vector3(
Random.Range(transform.position.x, RightSide.transform.position.x),
transform.position.y,
0
);
// Спавним случайный объект из списка
Instantiate(items[Random.Range(0, items.Length)], pos, transform.rotation);
}
}
После прикрепления скрипта перетащи объект RightSide
в
нужное поле в Inspector. Затем разверни массив
Items
и перетащи туда префабы Fish
и
Bomb
. Установи Start Delay
и
Repeat Rate
на 2
(можно изменить позже).
Готово! Нажми Play — и увидишь, как предметы начинают падать. Генератор работает — теперь у игры появляется динамика ✨
Сделаем так, чтобы корзина действительно ловила предметы. Благодаря
встроенной физике 2D и нашим Collider2D
компонентам, мы
можем использовать триггеры для отслеживания
столкновений.
Напишем скрипт, который будет проверять — хороший или плохой объект игрок поймал. Если хороший — увеличим счёт, если плохой — уменьшим. В обоих случаях объект исчезает.
Правый клик в папке Assets →
Create → MonoBehaviour Script. Назови его
ItemChecker
и открой.
В скрипте используется метод OnTriggerEnter2D()
. Unity
сам вызовет его, когда какой-либо объект с
Collider2D
попадёт в триггерную зону.
using UnityEngine;
public class ItemChecker : MonoBehaviour
{
// Счёт игрока
public int score;
// Вызывается при столкновении с триггером
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Good")
{
score += 10;
Destroy(other.gameObject);
}
if (other.gameObject.tag == "Bad")
{
score -= 10;
Destroy(other.gameObject);
}
}
}
Прикрепи скрипт ItemChecker
к объекту игрока (корзине).
Теперь Unity будет автоматически отслеживать столкновения с объектами и обновлять счёт. Значение счёта можно наблюдать прямо в Inspector, пока игра запущена.
Вот и всё! Ты собрал базовую версию 2D-игры «Лови!» — предметы падают, игрок двигается, срабатывают столкновения, обновляется счёт. Маленький прототип — с большим потенциалом 💡