В первой части мы уже создали основу нашей простой игры: игрок может двигаться, а предметы падают сверху. Теперь пора добавить игре больше смысла — сделаем так, чтобы одни предметы были хорошими, а другие — не очень. Мы добавим счёт, звуки и немного улучшим механику. Всё это — без спешки и стресса, шаг за шагом, чтобы ты мог легко создать свою первую игру на Unity.
Поехали. Запусти 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 (наш текст на 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
. Теперь мы делаем то же самое,
только задаём значение через скрипт.
Скрипт ждёт события соприкосновения падающего объекта с сачком. Затем по тегу определяет, какой это предмет, и в зависимости от типа увеличивает или уменьшает переменную счёта. После этого обновляем текст в компоненте так, чтобы он показывал наш текущий счёт.
Давайте оживим игру с помощью звуков — добавим эффекты при ловле
предметов. Мы используем простой способ: добавим компонент
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, если звук слишком громкий или тихий.
Настоящего шага 10 не будет — не потому, что больше нечего делать, а потому, что это хорошее место, чтобы сделать паузу. Есть много способов развить эту игру: можно добавить боковые триггеры, чтобы игрок ловил предметы только сверху, или менять теги объектов динамически.
Но цель была не в том, чтобы сделать что-то большое. А в том, чтобы показать что-то понятное. Если ты новичок в Unity — начинай с простого. Построй одну работающую вещь. Потом всегда можно добавить больше.
А кто знает — может, эта маленькая игра про ловлю перерастёт во что-то другое. Замени падающие предметы на машины, фон — на дорогу… и вдруг это уже гоночка. 😉
На этом всё во второй части — отличная работа! 🎉