Главная

Игра «Лови!» — Первые шаги

Добро пожаловать в твой первый туториал по Unity 2D. Мы шаг за шагом оживим простую игру с ловлей предметов. Опыт работы с Unity не нужен — просто установи Unity 6.0 LTS (или любую другую версию с поддержкой 2D) — и вперёд! Поиграй с настройками, нажми Play и смотри, как оживает твоё творение. Готов нырнуть? Поехали!

Шаг 1. Создаём проект

Запусти Unity Hub и создай новый 2D-проект, используя шаблон Universal 2D Core — это будет чистая и удобная основа.

Открой Unity Hub → вкладка ProjectsNew Project. Выбери шаблон Universal 2D Core (в нём уже есть базовая 2D-графика, шейдеры и физика). В зависимости от версии Unity название шаблона может немного отличаться — если нужного варианта нет, выбери 2D (URP) или обычный 2D. В поле имени проекта введи CatchGame (или придумай своё название и выбери папку). Нажми Create project и подожди, пока Unity всё подготовит.

💡 Совет: сразу выбери понятное имя и папку — это сэкономит время, когда проект станет больше.

Когда откроется Unity Editor, нас будут интересовать такие панели:

Обзор Unity Editor с пронумерованными панелями
Обзор редактора Unity:
  • 1. Scene — редактирование сцены.
  • 2. Game (камера) — вид, как в игре.
  • 3. Hierarchy — список всех объектов сцены.
  • 4. Inspector — свойства выбранного объекта.
  • 5. Favorites — быстрый доступ к любимым ассетам.
  • 6. Project — вся структура проекта и файлов.
  • 7. Play/Pause/Step — управление запуском игры.
  • 8. Toolbar — кнопки для частых операций.
  • 9. Tools — выбор инструментов (переместить/повернуть/масштаб).
  • 10. Scene/Game — переключение между режимами.

Шаг 2. Импорт графики

Для этой игры понадобятся четыре изображения: земля, ловец, хороший предмет и плохой предмет.

Ты можешь скачать готовую картинку, на которой все они уже нарисованы. Это просто отправная точка — потом ты легко сможешь улучшить или заменить изображения.

Превью картинки с ловцом, предметами и землёй
Нажми на картинку, чтобы её скачать.

Чтобы импортировать изображение в Unity: кликни правой кнопкой в окне Assets, выбери Import New Asset..., найди скачанный файл и нажми Import.

💡 Совет: ты можешь просто перетащить файл с изображением прямо в окно Assets — так даже быстрее.
💡 Совет: начни с простого — графику всегда можно доработать позже.

Шаг 3. Разделение спрайтового листа

После того как ты импортировал изображение catchgame-img.png, Unity обычно автоматически устанавливает режим Sprite Mode: Multiple. Но лучше проверить это вручную.

Почему Multiple? Это спрайтовый лист — в одном изображении собрано сразу несколько игровых элементов (земля, ловец, предметы). Разрезав его, ты получишь отдельные спрайты, которые можно перетаскивать в сцену.

Выдели изображение в папке Assets. В Inspector убедись, что Sprite Mode установлен в значение Multiple. Если нет — установи вручную и нажми Apply.

Теперь открой Sprite Editor из инспектора. В открывшемся окне нажми Slice в левом верхнем углу. Оставь настройки по умолчанию и снова нажми Slice, затем Apply.

Unity автоматически нарежет изображение на отдельные спрайты. Обычно он делает это довольно точно. Если нужно — ты можешь вручную подправить границы, перетаскивая их прямо в Sprite Editor.

Sprite Editor с четырьмя вырезанными спрайтами в Unity
Результат: все четыре спрайта вырезаны и появились в папке Assets.

💡 Совет: хочешь использовать собственные картинки? Вместо одного листа ты можешь импортировать четыре отдельных изображения. Просто кликни правой кнопкой в окне Assets, выбери Import New Asset..., укажи файлы и нажми Import.

💡 Совет: можно просто перетащить файлы с изображениями прямо в окно Assets — Unity всё подхватит автоматически.

Шаг 4. Создаём землю

Пора добавить землю в сцену. В папке Assets найди спрайт земли (например, catchgame-img_3) и перетащи его в окно Scene.

Убедись, что выбран инструмент Rectangle Tool, и растяни спрайт по ширине внизу сцены. Можешь подогнать границы, потянув мышкой.

В Hierarchy кликни правой кнопкой по объекту (например, catchgame-img_3) и переименуй его в Ground. Затем в Inspector установи Order in Layer на 100. Это гарантирует, что земля будет отрисована поверх других объектов — словно в верхнем слое.

💡 Что такое "Order in Layer"?
Unity использует это значение, чтобы определить порядок отображения спрайтов. Чем выше число — тем ближе к переднему плану. Можно использовать и отрицательные значения (например, -1), чтобы спрятать объект "позади".

Нажми Play, чтобы протестировать сцену — земля должна быть видна внизу. Затем снова нажми Play, чтобы вернуться в режим редактирования.

💡 Режим Play не сохраняет изменения
Всё, что ты изменишь во время запуска, исчезнет после выхода из Play Mode. Если хочешь сохранить правки — вноси их в режиме редактирования.

Сейчас земля видна в сцене — но она ещё не «твёрдая». Остальные объекты просто провалятся сквозь неё, потому что у неё нет коллайдера.

Давай это исправим. Выдели объект Ground в Hierarchy, затем в Inspector нажми Add ComponentPhysics 2DBox Collider 2D. Это добавит физическую форму, с которой другие объекты смогут взаимодействовать.

💡 Подгонка коллайдера
Коллайдер можно подстроить вручную — в Inspector разверни Box Collider 2D и отрегулируй значения, либо просто потяни края коллайдера в окне Scene.
Спрайт земли в Unity с Box Collider и Order in Layer
Объект земли с компонентом коллайдера и настройкой слоя отрисовки.

Шаг 5. Создаём игрока (ловца)

Добавим в сцену ловца — нашего игрока. Почти всё будет похоже на то, что мы делали с землёй.

  1. Найди спрайт ловца (например, XC-catchgame-img_2) в папке Assets и перетащи его в окно Scene.
  2. Убедись, что выбран инструмент Rectangle Tool, и настрой размер и положение ловца, как тебе удобно.
  3. В Hierarchy кликни правой кнопкой по объекту и переименуй его в Player.
  4. С выделенным Player нажми Add ComponentPhysics 2DBox Collider 2D.
💡 Совет: размер коллайдера
Unity старается подогнать коллайдер под непрозрачную часть спрайта. Но если у изображения есть отступы или оно смещено, можешь вручную изменить коллайдер, чтобы он точно соответствовал фигуре.

Теперь добавим компонент Rigidbody 2D, чтобы игрок реагировал на гравитацию и физику.

💡 Что такое Rigidbody?
Rigidbody 2D — это компонент, который позволяет физическому движку Unity управлять объектом: падение, столкновения, инерция. Без него игрок будет просто висеть в воздухе.

Оставив Player выбранным, снова нажми Add Component и выбери Rigidbody 2D. В его настройках установи Interpolate в значение Interpolate — это сделает движение более плавным.

Ещё можно сразу назначить тег для игрока — это пригодится в скриптах.

💡 Что такое Tag?
Теги — это метки для игровых объектов. С ними удобно находить и сравнивать объекты в коде. Unity обрабатывает теги быстрее, чем имена, и они чаще используются в логике.

В Inspector установи тег Player (возможно, его сначала нужно создать в Tag Manager).

Значение Order in Layer можешь оставить на 0 — пока этого достаточно.

Нажми Play — игрок должен упасть и встать на землю. Нажми ещё раз, чтобы вернуться к редактированию.

Игрок добавлен в сцену Unity с компонентами Box Collider и Rigidbody
Объект игрока с компонентами Box Collider 2D и Rigidbody 2D.

Шаг 6. Делаем игрока подвижным

Теперь дадим игроку возможность двигаться! Мы создадим простой скрипт на C#, который будет управлять скоростью Rigidbody2D в зависимости от клавиш.

В папке Assets кликни правой кнопкой и выбери Create → MonoBehaviour Script. Назови его PlayerMove (с заглавными P и M). Обрати внимание: имя файла и класса должны совпадать.

💡 Редактор скриптов
Скрипт откроется в Visual Studio или другом редакторе для C#. Visual Studio подсказывает синтаксис, подсвечивает ошибки и даёт быстрый доступ к документации Unity.
💡 Создание скрипта прямо из Inspector
Можно также выделить Player в Hierarchy, нажать Add ComponentNew Script, ввести имя PlayerMove и нажать Create and Add.

Открой файл PlayerMove.cs. Сначала в нём будет шаблон — мы заменим его на этот код:

💡 Кратко о методах Unity
Start() — запускается один раз в начале.
Update() — каждый кадр (здесь не нужен).
FixedUpdate() — с фиксированным интервалом (по умолчанию 0.02 сек), используется для физики.
💡 Input Manager
В классической системе ввода Unity ось "Horizontal" возвращает значение от -1 (влево, A) до 1 (вправо, D). Эти значения мы используем для расчёта движения.
💡 Скорость (Velocity)
Velocity — это 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 ComponentScriptsPlayerMove.

💡 Альтернатива
Можно просто перетащить скрипт PlayerMove из папки Assets в Inspector, когда выбран объект игрока.

Установи значение Speed в инспекторе, например 5.

Нажми Play и попробуй управлять игроком с помощью клавиш A/D или стрелок. Потом снова нажми Play, чтобы вернуться в режим редактирования.

Игрок в Unity со скриптом PlayerMove
У игрока добавлен скрипт движения и настроена скорость в инспекторе.

Шаг 7. Добавляем падающий объект

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

  1. Перетащи спрайт рыбы из папки Assets в окно Scene.
  2. В Hierarchy переименуй новый объект в Fish.
  3. В Inspector задай тег Tag как Good. Если такого тега нет, выбери UntaggedAdd Tag, создай новый тег Good, а потом снова выбери его у объекта.
  4. Установи Order in Layer на 5, чтобы рыба отрисовывалась выше, чем игрок.
  5. Нажми Add ComponentPhysics 2DRigidbody 2D.
  6. Установи Gravity Scale в 0.1 и Interpolate в Interpolate — для плавного движения.
  7. Добавь компонент Box Collider 2D и поставь галочку Is Trigger.
💡 Что такое Trigger-коллайдер?
Такой коллайдер не блокирует движение — объекты проходят сквозь него, но столкновение всё равно фиксируется. Это пригодится, когда игрок поймает рыбу.

Чтобы рыба не оставалась в сцене навсегда, если её не поймали, добавим скрипт для автоматического удаления через несколько секунд.

  1. Кликни правой кнопкой в папке AssetsCreate → MonoBehaviour Script. Назови его TimeDestroyer.
  2. Открой скрипт и замени его содержимое на следующее:
using UnityEngine;

public class TimeDestroyer : MonoBehaviour
{
    // Сколько секунд объект будет жить
    public float aliveTimer = 5f;

    // Вызывается при запуске
    void Start()
    {
        Destroy(gameObject, aliveTimer);
    }
}

Прикрепи скрипт к объекту Fish (Add Component → Scripts → TimeDestroyer). В инспекторе укажи Alive Timer = 5.

Теперь сделаем из рыбы Prefab, чтобы потом можно было легко создавать копии.

💡 Что такое Prefab?
Префаб — это заготовка объекта. С неё можно создавать копии во время игры или через скрипты.

Чтобы создать префаб, перетащи объект Fish из Hierarchy в папку Assets. Unity создаст синий значок префаба.

Объект рыбы в Unity с Rigidbody 2D, Is Trigger и скриптом уничтожения
Объект Fish с Rigidbody2D, Trigger-коллайдером, скриптом удаления и сохранённым префабом.

Шаг 8. Создаём плохой предмет (бомбу)

У нас есть хороший предмет — рыба. Теперь создадим плохой — бомбу, которую нужно избегать. Мы просто используем префаб рыбы и немного его изменим.

  1. Скопируй объект Fish
    Убедись, что ты редактируешь экземпляр префаба в Hierarchy, а не сам префаб в Assets.
    Кликни правой кнопкой по Fish в сцене и переименуй его в Bomb.
  2. Смени спрайт
    В Inspector перетащи изображение бомбы из Assets в поле Sprite (или нажми на кружочек справа и выбери нужный спрайт).
  3. Смени тег
    Задай тег Bad.
    💡 Как создать новый тег?
    Если тега Bad ещё нет:
    • Кликни по выпадающему списку тегов → Add Tag…
    • Нажми +
    • Добавь новый тег с именем Bad
    • Вернись к объекту Bomb и назначь ему этот тег
  4. Подстрой коллайдер
    Нажми Edit Collider, чтобы отрегулировать Box Collider 2D под новый спрайт.
  5. Создай префаб
    Перетащи Bomb из Hierarchy в Assets, чтобы создать новый префаб.
💡 Совет: очистка сцены
Теперь можно удалить объект Bomb из сцены — позже мы будем спавнить его из префаба.
Объект бомбы с новым спрайтом, тегом, коллайдером и префабом
Объект Bomb на основе Fish: новый спрайт, тег Bad, сохранён как префаб.

Шаг 9. Генерация объектов

Добавим движение сверху. На этом шаге мы создадим простой генератор предметов — он будет «ронять» случайные объекты (например, рыбу или бомбу) сверху вниз.

Начнём с размещения двух невидимых объектов — они обозначат зону появления. Один слева, один справа — между ними и будут появляться предметы.

В 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 (можно изменить позже).

Spawner и RightSide настроены, префабы добавлены, скрипт прикреплён
Два объекта на границах, скрипт прикреплён, префабы и параметры заданы.

Готово! Нажми Play — и увидишь, как предметы начинают падать. Генератор работает — теперь у игры появляется динамика ✨

Шаг 10. Обработка ловли предметов

Сделаем так, чтобы корзина действительно ловила предметы. Благодаря встроенной физике 2D и нашим Collider2D компонентам, мы можем использовать триггеры для отслеживания столкновений.

Напишем скрипт, который будет проверять — хороший или плохой объект игрок поймал. Если хороший — увеличим счёт, если плохой — уменьшим. В обоих случаях объект исчезает.

Правый клик в папке AssetsCreate → 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, пока игра запущена.

Игрок со скриптом ItemChecker и полем счёта
Скрипт ItemChecker прикреплён к игроку и отслеживает столкновения.

Вот и всё! Ты собрал базовую версию 2D-игры «Лови!» — предметы падают, игрок двигается, срабатывают столкновения, обновляется счёт. Маленький прототип — с большим потенциалом 💡