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
- uGUI — первая система UI Unity, основана на GameObject; ей делаются интерфейсы игр и приложений. Именно с ней мы работаем в этом конспекте.
- UI Toolkit — новая система, пришедшая из веб-разработки; позволяет создавать расширения для редактора Unity и интерфейсы реального времени.
- IMGUI — система «из кода»: инструменты отладки и пользовательские инспекторы редактора; для игровых интерфейсов не рекомендуется.
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), справа — «экран» с кнопкой. Меняйте размер экрана ползунками и переключайте якорь: кнопка с угловым якорем держится за свой угол, с центральным — за середину, а с якорем-растяжкой меняет размер вместе с экраном. Ромбик — положение якоря.
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); } }
Разбор нового:
- [RequireComponent(typeof(Rigidbody))] — атрибут перед объявлением класса: принудительно добавляет объекту компонент Rigidbody, раз он нужен скрипту. Своеобразная «защита от дурака»; так можно требовать до трёх компонентов.
- [SerializeField] private float powerImpulse — приватное поле, которое благодаря атрибуту видно и редактируется в инспекторе: сила остаётся закрытой для других скриптов, но настраивается без правки кода.
- gameObject — объект, на котором висит скрипт; GetComponent<Rigidbody>() возвращает ссылку на компонент указанного в угловых скобках типа. Ссылку сохраняем в Start — это то самое кэширование из A07.
- AddForce(Vector3.forward * powerImpulse) — приложить к телу физическую силу; направление задаётся готовыми векторами (forward, left), умноженными на силу. Методы публичные — к ним будут обращаться кнопки.
Прикрепляем методы к кнопкам: скрипт — на шар; затем у каждой кнопки в поле OnClick() нажимаем «плюс», перетаскиваем шар из иерархии в поле объекта и выбираем в списке нужный метод — BallMove → MoveUp и так далее. Запускаем: шар катится по нажатию кнопок.
Контрольные вопросы
-
Canvas — холст, на котором размещаются элементы интерфейса (с компонентами Rect Transform, Canvas, Canvas Scaler, Graphics Raycaster), и EventSystem — обработчик нажатий на холст.
-
В Canvas Scaler выбрать режим Scale With Screen Size, задать эталонное разрешение (Reference Resolution, например 1920×1080) и Screen Match Mode: Expand; каждому элементу назначить якорь у края, за который он должен держаться.
-
Точка или рамка на холсте, от которой отсчитывается положение (и при растяжке — размер) элемента. Кнопка с якорем в углу держится за угол при любом разрешении; якорь-растяжка меняет размер элемента вместе с экраном.
-
Ставится перед объявлением класса и принудительно добавляет объекту указанный компонент (до трёх), который нужен скрипту, — защита от ситуации, когда скрипт добавили, а необходимый компонент забыли.
-
Атрибут делает приватное поле видимым и редактируемым в инспекторе, не открывая его другим скриптам: настройка без правки кода сохраняется, а инкапсуляция не нарушается.
-
Через событие OnClick() компонента Button: в списке события добавляется запись, в поле объекта перетаскивается объект со скриптом, из выпадающего списка выбирается публичный метод. По нажатию Unity вызовет его.
-
Application.Quit() закрывает только собранное приложение и не действует в редакторе. Директива платформозависимой компиляции добавляет в редакторе выход из режима Play (EditorApplication.ExitPlaymode), а в сборку этот код не попадает.
-
Порядок сцен в File → Build Settings: первая сцена списка имеет индекс 0, вторая — 1 и так далее. Сцена, не добавленная в список, загрузиться не может.
Источники
- Unity UI (uGUI) // Unity Documentation : [сайт]. — URL: https://docs.unity3d.com/Packages/com.unity.ugui@latest (дата обращения: 08.07.2026).
- Basic Layout (Rect Transform, Anchors) // Unity Documentation : [сайт]. — URL: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/UIBasicLayout.html (дата обращения: 08.07.2026).
- SceneManager // Unity Scripting API : [сайт]. — URL: https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.html (дата обращения: 08.07.2026).
- Кватернион // Википедия : свободная энциклопедия. — URL: https://ru.wikipedia.org/wiki/Кватернион (дата обращения: 08.07.2026).
- Platform dependent compilation // Unity Documentation : [сайт]. — URL: https://docs.unity3d.com/Manual/platform-dependent-compilation.html (дата обращения: 08.07.2026).