 
    Добро пожаловать в дружелюбный пошаговый Unity 2D tutorial для начинающих! Вместе мы соберём простой прототип игры «Лови!», где вы научитесь:
Для старта вам понадобится установить Unity 6.0 LTS или любую другую версию с поддержкой 2D. Опыт работы с Unity не требуется — достаточно желания учиться и немного свободного времени. Приступим!
Запусти Unity Hub и создай новый 2D-проект, выбрав шаблон 2D Core (Built-In Render Pipeline) — это простая и чистая основа для твоей первой 2D-игры.
          Для этого открой Unity Hub → вкладка Projects →
          New Project. Найди шаблон
          2D Core (Built-In Render Pipeline) (он уже содержит
          базовую 2D-графику и физику). В зависимости от версии Unity название
          может немного различаться — если этого шаблона нет, смело бери
          2D (URP/SRP) или обычный 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 найди
          спрайт земли (например, 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. Это добавит физическую форму, с которой другие объекты смогут взаимодействовать.
 
          
          Добавим в сцену ловца — нашего игрока. Почти всё будет похоже на то, что мы делали с землёй.
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 в
          зависимости от клавиш.
        
          В этом скрипте с помощью Input Manager мы будем сначала
          проверять, нажата ли кнопка для движения влево или вправо.
        
"Horizontal" возвращает значение от -1 (влево, A) до 1
          (вправо, D). Эти значения мы используем для расчёта движения.
        
          Потом в зависимости от результата мы изменим скорость игрока в
          Rigidbody2D, что вызовет его движение в сцене.
        
Vector2 (или Vector3 в 3D),
          определяющий скорость и направление. Изменяя скорость
          Rigidbody2D, мы двигаем объект.
        
          В папке Assets кликни правой кнопкой и выбери
          Create → MonoBehaviour Script. Назови его PlayerMove (с заглавными P и M). Обрати
          внимание: имя файла и класса должны совпадать.
        
          Открой файл PlayerMove.cs. Сначала в нём будет шаблон —
          мы заменим его на этот код:
        
Start() — запускается один раз в начале.Update() — каждый кадр (здесь не нужен).FixedUpdate() — с фиксированным интервалом (по умолчанию
          0.02 сек), используется для физики.
        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()
    {
        //получаем линк на Rigidbody2D игрока
        rb = GetComponent<Rigidbody2D>();
    }
    // Вызывается каждую физическую итерацию (по умолчанию 0.02 сек)
    void FixedUpdate()
    {
        // Получаем ввод с клавиатуры (влево (x < 0) или вправо (x > 0))
        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 ещё нет:
              BadBomb из 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. Поэтому чтобы объект был видим, его позиция по Z должна быть больше -10 — например Z = 0, 1 или даже 100 — главное, чтобы он находился перед камерой.
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()
    {
        // Случайная позиция по X между текущим объектом (Spawner) и RightSide
        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 войдёт в триггерную область этого объекта.
          Наши падающие объекты сами являются такими триггерами — мы включили
          опцию Is Trigger на их коллайдерах — поэтому при
          соприкосновении с игроком этот метод сработает.
        
using UnityEngine;
public class ItemChecker : MonoBehaviour
{
    // Счёт игрока, отображающий количество набранных очков
    public int score;
    // Этот метод вызывается Unity автоматически,
    // когда коллайдер корзины входит в область триггер-коллайдера другого объекта
    void OnTriggerEnter2D(Collider2D other)
    {
        // Проверяем, есть ли у объекта тег "Good"
        // Если да — добавляем очки и уничтожаем объект
        if (other.CompareTag("Good"))
        {
            score += 10;
            Destroy(other.gameObject);
        }
        // Проверяем, есть ли у объекта тег "Bad"
        // Если да — вычитаем очки и также уничтожаем объект
        if (other.CompareTag("Bad"))
        {
            score -= 10;
            Destroy(other.gameObject);
        }
    }
}
          Прикрепи скрипт ItemChecker к объекту игрока (корзине).
        
Теперь Unity будет автоматически отслеживать столкновения с объектами и обновлять счёт. Значение счёта можно наблюдать прямо в Inspector, пока игра запущена.
 
          
          Вот и всё! Ты собрал базовую версию 2D-игры «Лови!» — предметы падают, игрок двигается, срабатывают столкновения, обновляется счёт. Маленький прототип — с большим потенциалом 💡