Траектория «Геймдев» · линия A · конспект 8 из 13

UI и сцены: Canvas, кнопки, меню

О чём эта тема
Пользовательский интерфейс на uGUI — холст, якоря, кнопки — и управление сценами: от кнопок, катающих шар, до главного меню с запуском игры и выходом.
Аннотация
Конспект начинается с обзора трёх систем UI в Unity и устройства холста (Canvas): его компоненты, порядок отрисовки и настройка под разные разрешения через Canvas Scaler. Далее — RectTransform и якоря: почему без них кнопки «убегают» при смене разрешения; поведение якорей закрепляется интерактивным стендом. Затем разбираются элементы Image, Text (TMP) и Button (TMP) с их состояниями и событием OnClick. Практическая часть — два скрипта с построчным разбором: BallMove, двигающий шар силами по нажатию кнопок, и MainMenuScript для сцены главного меню: создание объектов из префаба, уничтожение, загрузка сцены и выход из приложения. Завершают конспект порядок сцен в Build Settings и починка освещения при переходах между сценами.
Пререквизиты
A05 — сцена, префабы, материалы; A07 — скрипты, MonoBehaviour, Update, модификаторы доступа. Сцена-площадка с шаром из A05 используется как основа.
Мотивация
Карта игрового процесса из A01 начинается с главного меню — а наша игра пока запускается сразу «в игру», и управлять шаром можно только из окна сцены редактора. Этот конспект закрывает оба разрыва: игрок получает кнопки на экране, а игра — меню со «Начать игру» и «Выход». Заодно решается вопрос, который убивает интерфейсы на защите проекта: почему на ноутбуке всё было красиво, а на проекторе кнопки уехали за край экрана.

1. Системы UI в Unity

2. Холст (Canvas)

Создание: правая кнопка мыши в иерархии → UI → Canvas (или через меню GameObject). Появятся два объекта: Canvas — холст, на котором размещаются элементы интерфейса, и EventSystem — обработчик нажатий на холст. На объекте Canvas четыре компонента: Rect Transform (Transform, созданный специально под UI), Canvas (сам холст), Canvas Scaler (изменение размера холста) и Graphics Raycaster (попадание указателя в элементы).

В Canvas важна иерархия: чем выше объект в списке иерархии, тем ниже его приоритет отрисовки — нижние в списке рисуются поверх верхних.

Canvas Scaler — первое, что настраивается на холсте, чтобы интерфейс не разваливался при разных размерах окна. Режим Scale With Screen Size: холст масштабируется вслед за экраном; Reference Resolution — эталонное разрешение (практичный выбор — 1920×1080, 16:9); Screen Match Mode: Expand — за основание берётся самая узкая сторона, и элементы масштабируются пропорционально.

3. RectTransform и якоря

У любого объекта на холсте вместо Transform — компонент RectTransform: позиция, ширина и высота — плюс новый элемент, якорь (Anchor). Якорь — точка (или рамка) на холсте, от которой отсчитывается положение элемента. Кнопка с якорем в левом нижнем углу «держится» за этот угол при любом разрешении; кнопка с якорем-растяжкой меняет размер вместе с экраном.

Окно Anchor Presets в инспекторе: сетка готовых шаблонов якоря по девяти позициям и растяжкам; выбран левый нижний угол
Готовые шаблоны якорей в RectTransform: Shift дополнительно задаёт pivot, Alt — сразу перемещает объект
Анимация: выбор якоря с зажатым Shift — привязка позиции элемента на холсте
Привязка через Shift
Анимация: выбор якоря с зажатым Alt — элемент сразу перемещается к точке привязки
Привязка через Alt
Тренажёр · якоря RectTransform

Слева — шаблоны якоря (как в Anchor Presets), справа — «экран» с кнопкой. Меняйте размер экрана ползунками и переключайте якорь: кнопка с угловым якорем держится за свой угол, с центральным — за середину, а с якорем-растяжкой меняет размер вместе с экраном. Ромбик — положение якоря.

якорь
КНОПКА

Типичная ошибка Расставить элементы без настройки якорей и Canvas Scaler и проверить игру только в одном разрешении. На другом мониторе кнопки «уезжают» за край или сбиваются в угол. Правило: сразу после создания холста — Canvas Scaler в Scale With Screen Size; каждому элементу — якорь у того края, за который он должен «держаться».

4. Элементы: Image, Text (TMP), Button (TMP)

Image — картинка на холсте. Вместе с ней добавляется Canvas Renderer (он игнорирует геометрию элемента там, где прозрачность близка к нулю). Параметры: Source Image — спрайт; Color — цвет; Material — материал; Raycast Target — участвует ли элемент в попадании указателя; Maskable — применяется ли маска родителя.

Text (TMP) — текст. Использовать стоит именно TMP-версию (TextMeshPro), а не Legacy Text: функциональность заметно шире, а настройки привычны по текстовым редакторам. При первом создании TMP-элемента Unity предложит импортировать ресурсы — нажимаем Import TMP Essentials.

Button (TMP) — кнопка: при создании появляются компоненты Image и Button и дочерний объект Text (TMP). У кнопки настраиваются цвета состояний: обычное (Normal), наведение (Highlighted), нажатие (Pressed), выбор (Selected) и выключенное (Disabled — кнопка выключается снятием галочки Interactable). Главное в кнопке — событие OnClick() (Unity Event): список действий, выполняемых по нажатию.

5. Практика: кнопки двигают шар

Основа — сцена из A05. Сначала оградим площадку «забором» из растянутых кубов с отдельным материалом, чтобы шар не выкатывался, и поставим камеру над полем. Затем в иерархии создадим пустой объект UI — родителя для кнопок — и внутри него четыре кнопки Button — TextMeshPro с надписями направлений; расставим их по холсту и закрепим якорями.

Скрипт движения:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class BallMove : MonoBehaviour
{
    private Rigidbody ball;                            // ссылка на компонент Rigidbody

    [SerializeField] private float powerImpulse = 80f; // сила толчка; видна в инспекторе

    void Start()
    {
        ball = gameObject.GetComponent<Rigidbody>();
    }

    public void MoveUp()    { ball.AddForce(Vector3.forward * powerImpulse); }
    public void MoveDown()  { ball.AddForce(-Vector3.forward * powerImpulse); }
    public void MoveLeft()  { ball.AddForce(Vector3.left * powerImpulse); }
    public void MoveRight() { ball.AddForce(-Vector3.left * powerImpulse); }
}

Разбор нового:

Прикрепляем методы к кнопкам: скрипт — на шар; затем у каждой кнопки в поле OnClick() нажимаем «плюс», перетаскиваем шар из иерархии в поле объекта и выбираем в списке нужный метод — BallMove → MoveUp и так далее. Запускаем: шар катится по нажатию кнопок.

Инспектор кнопки: событие OnClick, выпадающий список компонентов объекта Sphere и методы MoveUp, MoveDown, MoveLeft, MoveRight скрипта BallMove
Выбор метода скрипта в событии OnClick() кнопки
Типичная ошибка Пустое поле объекта в OnClick() или несозданная ссылка в скрипте. Кнопка молчит, а в консоли появляется NullReferenceException. Проверка всегда одна: чем заполнено поле в инспекторе — и назначен ли объект, и выбран ли метод.

Контрольные вопросы

Источники

  1. Unity UI (uGUI) // Unity Documentation : [сайт]. — URL: https://docs.unity3d.com/Packages/com.unity.ugui@latest (дата обращения: 08.07.2026).
  2. Basic Layout (Rect Transform, Anchors) // Unity Documentation : [сайт]. — URL: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIBasicLayout.html (дата обращения: 08.07.2026).
  3. SceneManager // Unity Scripting API : [сайт]. — URL: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.html (дата обращения: 08.07.2026).
  4. Кватернион // Википедия : свободная энциклопедия. — URL: https://ru.wikipedia.org/wiki/Кватернион (дата обращения: 08.07.2026).
  5. Platform dependent compilation // Unity Documentation : [сайт]. — URL: https://docs.unity3d.com/Manual/platform-dependent-compilation.html (дата обращения: 08.07.2026).