В Части 1 мы оживили простую игру: игрок двигается, предметы падают — и есть радость в том, чтобы видеть, как всё работает. Теперь пора добавить смысл — одни предметы будут хорошими, другие не очень. Мы добавим счёт, определим, что такое победа, и мягко подготовим игру к настоящей игре. Без давления. Просто один понятный шаг за раз.
Поехали. Запусти Unity и открой проект Catch Game, который ты создал в Части 1. Найди свою сцену в окне Assets и дважды щёлкни, чтобы загрузить её. Если ты пропустил Часть 1, можешь вернуться к ней здесь.
Когда сцена откроется, редактор Unity будет выглядеть примерно так:
Сейчас игрок может упасть за пределы сцены слева или справа. Чтобы
этого избежать, добавим невидимые стены. Создай новый пустой
GameObject — через
GameObject → Create Empty или правым кликом в окне
Hierarchy, выбрав Create Empty. Переименуй
его в LeftWall
.
Выдели LeftWall
, затем в Inspector нажми
Add Component → Physics 2D →
Box Collider 2D. Нажми Edit Collider и
подгони коллайдер в сцене зелёными ручками. С помощью
Move Tool размести стену слева. Убедись, что значение
по оси Z
— 0
. При желании можно назначить
значок-гизмо для удобства.
Чтобы создать вторую стену, просто дублируй LeftWall
—
кликни по нему правой кнопкой в Hierarchy и выбери
Duplicate. Переименуй копию в RightWall
и
перемести её направо. Теперь игрок не сможет выпадать за пределы.
Добавим простой интерфейс, который будет показывать счёт на экране.
Перейди в 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 много настроек. Но тебе нужно изменить лишь несколько — мы оставим всё простым и аккуратным.
Давай вернёмся к основному игровому виду. Дважды щёлкни по Main Camera в Hierarchy, чтобы сфокусироваться на ней, или переключись на вкладку Game, чтобы увидеть полный игровой экран.
Теперь мы сделаем так, чтобы текст счёта обновлялся во время игры.
Открой скрипт ItemChecker
(дважды щёлкни по нему в окне
Assets). Чтобы работать с UI-системой TextMeshPro,
добавь в начало такую строку:
using TMPro;
Мы создадим ссылку на объект Score
и получим его
текстовый компонент, затем будем обновлять отображение каждый раз при
изменении счёта. Вот полный код обновлённого скрипта:
using UnityEngine;
using TMPro;
public class ItemChecker : MonoBehaviour
{
// Текущий счёт
public int score;
// Сюда перетащи объект Score в инспекторе
public GameObject scoreTextObject;
// Внутренняя ссылка на компонент TMP
private TMP_Text tmpText;
void Start()
{
// Получаем компонент TextMeshProUGUI из объекта Score
tmpText = scoreTextObject.GetComponent<TMP_Text>();
}
// Вызывается при попадании объекта с Collider2D в триггер
void OnTriggerEnter2D(Collider2D other)
{
// Если объект имеет тег "Good", увеличиваем счёт
if (other.gameObject.tag == "Good")
{
score += 10;
Destroy(other.gameObject);
}
// Если тег "Bad", уменьшаем счёт
if (other.gameObject.tag == "Bad")
{
score -= 10;
Destroy(other.gameObject);
}
// Обновляем отображение счёта
tmpText.text = score.ToString();
}
}
Не забудь перетащить свой UI-объект Score
в поле
Score Text Object в компоненте
ItemChecker на объекте игрока.
Давайте оживим игру с помощью звуков — добавим эффекты при ловле
предметов. Мы используем простой способ: добавим компонент
AudioSource
игроку и будем воспроизводить звуки из
скрипта.
Сначала выбери игрока в Hierarchy и нажми Add Component. Выбери AudioSource. Оставь все настройки по умолчанию — он будет использоваться только для коротких эффектов.
Затем открой скрипт ItemChecker
и обнови его так:
public AudioClip okSound;
public AudioClip boomSound;
private AudioSource audioSource;
void Start() {
audioSource = GetComponent<AudioSource>();
}
void OnTriggerEnter2D(Collider2D other) {
// ... логика счёта ...
// Воспроизводим звук в зависимости от тега
if (other.tag == "Good") {
audioSource.PlayOneShot(okSound);
} else if (other.tag == "Bad") {
audioSource.PlayOneShot(boomSound);
}
}
Ты можешь скачать звуки, использованные в этом уроке, здесь:
Сохрани их в папку Assets/Sounds
и назначь в инспекторе.
Перетащи файлы Ok
и Boom
из папки
Assets в соответствующие поля компонента
ItemChecker.
💡 Подсказка: громкость можно настроить прямо в компоненте AudioSource, если звук слишком громкий или тихий.
Настоящего шага 10 не будет — не потому, что больше нечего делать, а потому, что это хорошее место, чтобы сделать паузу. Есть много способов развить эту игру: можно добавить боковые триггеры, чтобы игрок ловил предметы только сверху, или менять теги объектов динамически.
Но цель была не в том, чтобы сделать что-то большое. А в том, чтобы показать что-то понятное. Если ты новичок в Unity — начинай с простого. Построй одну работающую вещь. Потом всегда можно добавить больше.
А кто знает — может, эта маленькая игра про ловлю перерастёт во что-то другое. Замени падающие предметы на машины, фон — на дорогу… и вдруг это уже гоночка. 😉
На этом всё во второй части — отличная работа! 🎉