Исследование UI в Unity 4.6 beta

Я помню что у вас тут были люди которые писали про Unity3D, так что вот вам заметочка:)

На днях начал изучать новый UI. Все что на оф сайте в видео туториалах естетсвенно было просмотрено, но там нет ничего о том как новый UI работает. Доков я тоже не увидел и естественно захотелось разобраться как это все работает. Итак, кратко о том что я понял:

Исходя из исследований методом тыка, основным объектом без которого построение UI невозможно является Canvas. Он отвечает за отрисовку элементов интерфейса и проброс событий к ним. Так же у канваса есть 3 варианта отрисовки UI: ScreenSpace - Overlay, ScreenSpace - Camera и WorldSpace.

ScreenSpace - Overlay и ScreenSpace - Camera
Как видно из названия режимов, они работают с экранными координатами. Это позволяет собирать PixelPerfect интерфейс, но если Вам нужно чтобы интерфейс выглядел одинаково на всех разрешениях, или Вы хотите создать 3D UI - эти варианты Вам не подходят.

WordlSpace
Этот режим отрисовывает элементы в мировом пространстве, так что если у вас нет камеры в которую они будут попадать, то вы их можете не увидеть. Этот режим меня заинтересовал, так как позволяет создавать UI, который будет выглядеть одинаково независимо от разрешения экрана. Единсвенная небольшая проблема - это то что Canvas, в отличии от предыдущих режимов, не реагирует на изменение аспекта экрана. Но эта проблема решается простым скриптом, управляющим шириной/высотой канваса при старте.

Отдельные элементы я описывать не буду, все равно с ними можно ознакомиться методом математического тыка. А вот на систему сообщений стоит взглянуть поподробнее.

Во первых:
Чтобы Ваш UI работал, необходимо иметь на сцене EventSystem. EventSystem это компонент который занимается обработкой событий пользователя и передачей их в UI.
Обработка событий происходит в InputModule компонентах. Я встретил 2 (StandaloneInputModule для ПК, консолей и веба и TouchInputModule для мобильников и планшетов). Причем судя по их настройках они могут хотябы частично быть взаимозаменяемыми.
InputModule отлавливает события пользователя и передает их в EventSystem, которая уже направляет все это дело в UI. Но как же определяется активный элемент был нажат? За это отвечает GraphicRaycaster.

GraphicRaycaster
Этот компонент находится на Canvas-е и в ответ на нажатие мыши/тач определяет какому объекту надо послать событие. Всего в новом UI есть 3 типа рэйкастеров: рэйкастер для 2D физики, рейкастер для 3D физики и рэйкастер для графических элементов. По умолчанию на гейм объект добавляется последний.
У этого рейкастера есть один огромный недостаток: чтобы объект получил событие, он должен иметь графическую составляющую. Другими словами, если Вы хотите создать прозрачную область экрана, которая будет запускать то или иное действие по нажатию, Вам придется создавать компонент с графикой и делать его полностью прозрачным. По моему это очень неудобно, хорошо что есть возможность расширить эту систему введением новых рейкастеров.

Немного о коде.
Систему UI можно разделить на 3 части: система генерации событий (UnityEngine.Events) - нововведение в Unity 4.6, затрагивает не только UI, но и системы физики и рендера, система отлова событий (UnityEngine.EventSystems) и непосредственно логику UI (UnityEngine.UI). Причем первая система является частью основной билиотеки движка, а остальные 2 частью библиотеки UI.

Events
В этом пространстве имен собраны класы описывающие базовую струкру евентов. Существует 2 типа классов: UnityAction (источник события) и UnityEvent (слушатель события, при этом есть возможность слушать несколько событий). Они могут принимать до 4х параметров следующих типов: EventDefined, Void, Object, Int, Float, String, Bool (исходя из описания в Enum PresustentListenerMode).

EventSystems
Это простарнство имен содержит в себе классы и интерфейсы обеспечивающие обработку событий вля элдементов UI, при этом на каждое событие существует свой интерфейс. Также в этом пространстве имен находятся рейкастеры для физики и базовый класс для описания поведения UI элементов - UIBehaviour и настройки режимов ввода.

UI
Тут находятся классы непосредственно связянные с элементами UI. В том числе и описание для GraphicRaycaster-а, а также куча интерфейсов связанных с событиями. Это пространство имен я еще только начал исследовать, именно там кроется ключ к написанию собственных элементов UI.

Следующую часть я напишу когда разберусь как все-таки создать собственные элементы управления. На этом всем спасибо, если у Вас есть аналогичный опыт, буду рад прочитать о нем в комментариях.