Главная

Unity 2D Tutorial для новичков: продолжаем делать игру «Ловилка» на C#

В первой части мы уже создали основу нашей простой игры: игрок может двигаться, а предметы падают сверху. Теперь пора добавить игре больше смысла — сделаем так, чтобы одни предметы были хорошими, а другие — не очень. Мы добавим счёт, звуки и немного улучшим механику. Всё это — без спешки и стресса, шаг за шагом, чтобы ты мог легко создать свою первую игру на Unity.

Шаг 1. Загрузи свой проект

Поехали. Запусти Unity и открой проект Catch Game, который ты создал в Части 1. Найди свою сцену в окне Assets и дважды щёлкни, чтобы загрузить её. Если ты пропустил Часть 1, можешь 🎣вернуться к ней здесь🎣.

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

Редактор Unity с загруженной Catch Game
Проект Catch Game загружен в Unity — видны объекты игрока, земли и генератора.

Шаг 2. Добавь боковые стены

Сейчас игрок может упасть за пределы сцены слева или справа. Чтобы этого избежать, добавим невидимые стены. Создай новый пустой GameObject — через GameObject → Create Empty или правым кликом в окне Hierarchy, выбрав Create Empty. Переименуй его в LeftWall.

Выдели LeftWall, затем в Inspector нажми Add ComponentPhysics 2DBox Collider 2D. Нажми Edit Collider и подгони коллайдер в сцене зелёными ручками. С помощью Move Tool размести стену слева. Убедись, что значение по оси Z0. При желании можно назначить значок-гизмо для удобства.

Чтобы создать вторую стену, просто дублируй LeftWall — кликни по нему правой кнопкой в Hierarchy и выбери Duplicate. Переименуй копию в RightWall и перемести её направо. Теперь игрок не сможет выпадать за пределы.

Сцена Unity с размещёнными LeftWall и RightWall
Левая и правая стены добавлены как невидимые Box Collider'ы, чтобы не дать игроку покинуть экран.

Шаг 3. Добавь отображение счёта

Добавим простой интерфейс, который будет показывать счёт на экране. Перейди в GameObject → UI → Text - TextMeshPro. Unity автоматически создаст Canvas, объект Text (TMP) и EventSystem. Если ты впервые используешь TextMeshPro, Unity предложит импортировать TMP Essentials — просто нажми Import.

Дважды щёлкни Canvas в Hierarchy, чтобы сфокусировать вид на UI — ты увидишь белый прямоугольник, представляющий экран. Выдели Canvas и в Inspector измени UI Scale Mode на Scale with Screen Size, чтобы интерфейс правильно масштабировался.

Переименуй текстовый объект в Score. В Inspector задай текст 00. Включи Auto Size и установи Alignment по центру — по горизонтали и вертикали. Затем с помощью Rect Tool перемести и подгони блок с текстом ближе к верху экрана.

💡 Подсказка: Элементы TextMeshPro в UI не двигаются как спрайты — ты перемещаешь их контейнер. Используй Rect Tool (T), чтобы перемещать и масштабировать блок.

💡 Подсказка: В инспекторе TextMeshPro много настроек. Но тебе нужно изменить лишь несколько — мы оставим всё простым и аккуратным.

Текст счёта добавлен на Canvas с настройками TMP
Текст счёта добавлен в Canvas. Используй Auto Size и выравнивание по центру, затем размести его с помощью Rect Tool.

Шаг 4. Покажи счёт через код

Давай вернёмся к основному игровому виду. Дважды щёлкни по Main Camera в Hierarchy, чтобы сфокусироваться на ней, или переключись на вкладку Game, чтобы увидеть полный игровой экран.

Теперь мы сделаем так, чтобы текст счёта обновлялся во время игры. Открой скрипт ItemChecker (дважды щёлкни по нему в окне Assets). Чтобы работать с UI-системой TextMeshPro, добавь в начало такую строку:

using TMPro;

Мы создадим ссылку на объект Score и получим его текстовый компонент, затем будем обновлять отображение каждый раз при изменении счёта. Вот полный код обновлённого скрипта:

using UnityEngine;
using TMPro;

public class ItemChecker : MonoBehaviour
{
    // Переменная для хранения текущего счёта
    public int score;

    // Сюда в инспекторе перетащи объект Score (наш текст на Canvas)
    public GameObject scoreTextObject;

    // Внутренняя ссылка на компонент TMP_Text, чтобы потом менять текст
    private TMP_Text tmpText;

    void Start()
    {
        // Находим компонент TMP_Text на объекте Score
        tmpText = scoreTextObject.GetComponent<TMP_Text>();
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        // Если поймали объект с тегом "Good", увеличиваем счёт на 10
        if (other.gameObject.tag == "Good")
        {
            score += 10;
            // Убираем предмет со сцены
            Destroy(other.gameObject);
        }

        // Если поймали объект с тегом "Bad", уменьшаем счёт на 10
        if (other.gameObject.tag == "Bad")
        {
            score -= 10;
            // Убираем предмет со сцены
            Destroy(other.gameObject);
        }

        // Обновляем текст на Canvas, чтобы показать новый счёт
        tmpText.text = score.ToString();
    }
}

Не забудь перетащить свой UI-объект Score в поле Score Text Object в компоненте ItemChecker на объекте игрока.

В этом скрипте мы создаём прямую ссылку на текстовый компонент, который отображает счёт. В шаге 3 мы уже вручную меняли значение, когда вписали в поле 00. Теперь мы делаем то же самое, только задаём значение через скрипт.

Скрипт ждёт события соприкосновения падающего объекта с сачком. Затем по тегу определяет, какой это предмет, и в зависимости от типа увеличивает или уменьшает переменную счёта. После этого обновляем текст в компоненте так, чтобы он показывал наш текущий счёт.

Скрипт ItemChecker с установленным полем Score Text Object
Объект Score назначен в инспекторе — теперь текст будет автоматически обновляться при ловле предметов.

Шаг 5. Добавь звуковые эффекты

Давайте оживим игру с помощью звуков — добавим эффекты при ловле предметов. Мы используем простой способ: добавим компонент AudioSource игроку и будем воспроизводить звуки из скрипта.

Сначала выбери игрока в Hierarchy и нажми Add Component. Выбери AudioSource. Оставь все настройки по умолчанию — он будет использоваться только для коротких эффектов.

Затем открой скрипт ItemChecker и обнови его так:

using UnityEngine;
using TMPro;

public class ItemChecker : MonoBehaviour
{
    // Переменная для хранения текущего счёта
    public int score;

    // Сюда в инспекторе перетащи объект Score (наш текст на Canvas)
    public GameObject scoreTextObject;

    // Внутренняя ссылка на компонент TMP_Text, чтобы потом менять текст
    private TMP_Text tmpText;

    // Поле для аудиофайла "ок"
    public AudioClip okSound;

    // Поле для аудиофайла "взрыв"
    public AudioClip boomSound;

    // Переменная для ссылки на аудиопроигрыватель
    private AudioSource audioSource;

    void Start()
    {
        // Находим компонент TMP_Text на объекте Score
        tmpText = scoreTextObject.GetComponent<TMP_Text>();

        // Находим компонент AudioSource на этом объекте
        audioSource = GetComponent<AudioSource>();
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        // Воспроизводим звук в зависимости от тега
        if (other.tag == "Good")
        {
            audioSource.PlayOneShot(okSound);
        }
        else if (other.tag == "Bad")
        {
            audioSource.PlayOneShot(boomSound);
        }

        // Если поймали объект с тегом "Good", увеличиваем счёт на 10
        if (other.gameObject.tag == "Good")
        {
            score += 10;
            // Убираем предмет со сцены
            Destroy(other.gameObject);
        }

        // Если поймали объект с тегом "Bad", уменьшаем счёт на 10
        if (other.gameObject.tag == "Bad")
        {
            score -= 10;
            // Убираем предмет со сцены
            Destroy(other.gameObject);
        }

        // Обновляем текст на Canvas, чтобы показать новый счёт
        tmpText.text = score.ToString();
    }
}

Ты можешь скачать звуки, использованные в этом уроке, здесь:

Импортируй файлы в Unity.

Перетащи файлы Ok и Boom из папки Assets в соответствующие поля компонента ItemChecker.

💡 Подсказка: громкость можно настроить прямо в компоненте AudioSource, если звук слишком громкий или тихий.

AudioSource и назначенные звуки на игроке
AudioSource добавлен игроку, звуковые клипы назначены в инспекторе.

Шаг 10. Или… Просто оставь как есть

Настоящего шага 10 не будет — не потому, что больше нечего делать, а потому, что это хорошее место, чтобы сделать паузу. Есть много способов развить эту игру: можно добавить боковые триггеры, чтобы игрок ловил предметы только сверху, или менять теги объектов динамически.

Но цель была не в том, чтобы сделать что-то большое. А в том, чтобы показать что-то понятное. Если ты новичок в Unity — начинай с простого. Построй одну работающую вещь. Потом всегда можно добавить больше.

А кто знает — может, эта маленькая игра про ловлю перерастёт во что-то другое. Замени падающие предметы на машины, фон — на дорогу… и вдруг это уже гоночка. 😉

На этом всё во второй части — отличная работа! 🎉