Дослідження UI в Unity 4

Я пам'ятаю, що у вас тут були люди, які писали про Unity3D, так що ось вам нотатка:)

Виходячи з досліджень методом тику, основним об'єктом без якого побудова UI неможлива є Canvas. Він відповідає за малювання елементів інтерфейсу та прокидання подій до них. Також у канвасу є 3 варіанти відтворення UI: ScreenSpace - Overlay, ScreenSpace - Camera і WorldSpace.

Як видно з назви режимів, вони працюють з екранними координатами. Це дозволяє збирати 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 (виходячи з опису в EnumPresustentListenerMode).

EventSystems Це простір імен містить у собі класи та інтерфейси що забезпечують обробку подій для елдементів UI, причому на кожну подію існує свій інтерфейс. Також у цьому просторі імен знаходяться рейкастери для фізики та базовий клас для опису поведінки UI елементів – UIBehaviour та налаштування режимів введення.

UI Тут знаходяться класи безпосередньо пов'язані з елементами UI. У тому числі опис для GraphicRaycaster-а, а також купа інтерфейсів пов'язаних з подіями. Цей простір імен ще тільки почав досліджувати, саме там криється ключ до написання власних елементів UI.