UI и Ввод Unity: Как игрок взаимодействует с игрой

 Начало - Понимание Unity и C#


UI (интерфейс) и Input (ввод) — это мост между игроком и вашим игровым миром. Без хорошего UI игрок не поймет, сколько у него здоровья. Без правильного Input управление будет казаться «ватным». В современном Unity эти две системы тесно связаны через EventSystem — невидимый диспетчер, который распределяет клики, касания и нажатия клавиш по нужным объектам.


🖼️ Часть 1. UI — Интерфейс пользователя

⚠️ Забудьте про OnGUI!

Метод OnGUI из старых версий Unity устарел. Он работает медленно, не поддерживает адаптивность и используется только для отладочных оверлеев. Современный UI строится через Canvas и систему uGUI (Unity UI).

📐 Canvas — король интерфейса

Canvas — это специальный компонент-контейнер, внутри которого рисуются все UI-элементы.
Render Mode
Что это
Когда использовать
Screen Space - Overlay
UI поверх всего, привязан к экрану
Главные меню, HUD (здоровье, патроны)
Screen Space - Camera
UI рендерится камерой, может перекрываться
Инвентарь в 3D, прицелы с эффектами
World Space
UI как обычный 3D-объект в мире
Экраны на стенах, голограммы, кнопки в VR

🧱 Основные UI-компоненты

csharp

🎯 TextMeshPro — золотой стандарт текста

Забудьте про старый Text компонент. TextMeshPro (TMP) дает:
  • ✅ Четкий текст на любом разрешении (SDF-шрифты)
  • ✅ Поддержку эмодзи и спецсимволов
  • ✅ Rich Text (цвета, жирный, ссылки внутри текста)
  • ✅ Анимации и эффекты (outline, glow, shadow)
csharp


🎮 Часть 2. Input — Система ввода

📜 Две эпохи ввода в Unity

🔴 Legacy Input Manager (Старая система)

Edit -> Project Settings -> Input Manager
  • ✅ Простая, работает "из коробки"
  • ❌ Жесткая привязка к клавишам
  • ❌ Плохо работает с геймпадами и мобильными устройствами
  • ❌ Проверка каждый кадр (if (Input.GetKey...))
csharp

🟢 New Input System (Современный стандарт)

Устанавливается через Package Manager
  • ✅ Событийная модель (не нужно опрашивать каждый кадр)
  • ✅ Кроссплатформенность (клавиатура, геймпад, тач, VR-контроллеры)
  • ✅ Action-based (действия, а не клавиши)
  • ✅ PlayerInput компонент для быстрой настройки
csharp


⚡ Часть 3. EventSystem — Невидимый диспетчер

EventSystem автоматически добавляется на сцену при создании Canvas. Он отвечает за:
  • 🔍 Определение, какой UI-элемент находится под курсором/пальцем
  • 📡 Распределение событий (клики, наведения, перетаскивания)
  • 🎯 Работу с Raycasters (лучами, которые "щупают" UI)

🎯 Интерфейсы событий (IPointerClickHandler и другие)

Вместо того чтобы вешать Button на всё подряд, любой объект с Collider или Image может стать кликабельным через интерфейсы:
csharp

🔧 Основные интерфейсы EventSystem

Интерфейс
Событие
Когда использовать
IPointerClickHandler
Клик по объекту
Кнопки, иконки инвентаря
IPointerEnterHandler
Курсор навелся
Подсветка, подсказки
IDragHandler
Перетаскивание
Слайдеры, drag'n'drop
IScrollHandler
Прокрутка колесом
Списки, инвентари
ISubmitHandler
Enter/кнопка геймпада
Подтверждение в меню
IMoveHandler
Стрелки/D-pad
Навигация по меню


💡 Шпаргалка: "Что использовать и где?"

Задача
Решение
Компонент/Метод
Текст на экране
TextMeshPro
TextMeshProUGUI компонент
Полоска здоровья
Заполняемая картинка
Image с fillAmount
Кнопка в меню
Button компонент
onClick.AddListener(...)
Кликабельный 3D объект
Интерфейсы событий
IPointerClickHandler + Collider
Движение персонажа
New Input System
InputAction + PlayerInput
Нажатие прыжка
Событие performed
context.performed в Input Action
Сенсорное управление
New Input System
Touchscreen API
Виртуальный джойстик
UI + Events
IDragHandler на UI элементе
Инвентарь drag'n'drop
EventSystem
IBeginDragHandler, IDragHandler, IEndDragHandler


⚠️ Золотые правила UI и Input

  1. Всегда используйте TextMeshPro вместо старого Text — это стандарт индустрии с 2018 года.
  2. Используйте New Input System для новых проектов — Legacy официально deprecated.
  3. Не опрашивайте Input каждый кадр (Input.GetKey) — используйте событийную модель (context.performed).
  4. Для UI-кликов используйте интерфейсы (IPointerClickHandler), а не OnMouseDown (он работает только с 3D-коллайдерами и камерой).
  5. Кэшируйте ссылки на UI-элементы в Awake или через [SerializeField] — не ищите их через GetComponent в Update.
  6. Используйте Canvas Scaler для адаптивности — настройте Scale With Screen Size и выберите референсное разрешение (например, 1920x1080).
  7. Для сложных UI используйте Layout Groups (VerticalLayoutGroup, GridLayoutGroup) — они автоматически расставляют элементы.
  8. Не смешивайте UI и 3D-мир без необходимости — World Space Canvas должен использоваться только для внутриигровых интерфейсов (экраны, голограммы).


🚀 Pro-совет: ScriptableObjects для UI

Храните настройки UI (цвета, размеры шрифтов, стили кнопок) в ScriptableObjects. Это позволит дизайнеру менять внешний вид игры без правки кода и создания префабов для каждой кнопки.
csharp

Комментарии

Популярные сообщения из этого блога

Unity3D C#

MQL4 событие OnChartEvent()

Ответы по промбезопасности. А.1. ПБП 115.15 Подготовка и аттестация руководителей и специалистов организаций по основам промышленной безопасности