Розширення функціоналу Scene View у Unity3D
Для того, щоб мати можливість писати скрипти, що працюють у Scene view в першу чергу клас з яким ви працюєте повинен бути успадкований від Editor або EditorWindow, що передбачає підключення namespace UnityEditor. Це дає доступ до кількох магічних методів Unity3D, таких як OnGUI() і OnSceneGUI(). Метод OnSceneGUI дає можливість Editor'у керувати подіями Scene View.
Повернемося до перехоплення подій. Ідея полягає в тому, щоб позначити об'єкт, для якого ми розробляємо функціонал як елемент інтерфейсу Unity, на рівні з Label або Button з IMGUI.
В api існує клас Event, який використовується для різних GUI подій, наприклад, натискання клавіш, кнопок миші, подій рендерингу та layout'у Unity.
Крім Event для перехоплення кліків знадобиться така річ, як control. Як control у Unity може бути будь-який елемент IMGUI. Наприклад, Button або Label. Для того щоб ваш об'єкт перехоплював клік, необхідно сказати Unity, що він теж є control і збирається брати участь в обробці подій. Для цього скористаємося класом GUIUtility. Кожен control повинен мати власний унікальний id, за допомогою якого Unity отримає всю необхідну інформацію про нього. id є int, проте варто помітити, що він має бути унікальним. Ви можете згенерувати випадкове число (відмінне від 0) і вважати його id вашого control, але при цьому немає гарантії, що в системі вже немає control з таким же id, і в такому випадку клік піде не до того елемента, на який ви розраховували. Для створення унікального id використовуємо метод із класу GUIUtility
Параметр, що приймається на вхід цим методом, відповідає за можливість control отримувати будь-яке введення з клавіатури. Інформацію про нього, можна отримати удокументації. Оскільки введення з клавіатури у разі використання Scene View не потрібне, підійде значення FocusType.Passive.
Тепер, коли ми розібралися з отриманням id, настав час розібратися з перехопленням подій. Ми можемо отримати інформацію про поточну подію за допомогою Event.current. Щоб отримати тип події, що сталася в Unity, потрібно зробити наступне
Даний дзвінок поверне значення типу EventType для нашого control. Далі потрібно лише визначитися які саме події вам потрібні та перехопити їх. Безпосередньо перехоплення події здійснюється так
У випадку з кліком миші, цим ви кажете, що ваш control є «гарячим», тобто він в першу чергу буде реагувати на події миші, і вони не підуть далі до інших conltrol. Цей аспект детально описаний у документації. Щоб повернути доступ до подій миші до інших control необхідно зробити
Цим ви скажете, що наступні події миші можуть перехопити будь-який інший control. Також події будуть доступними для інших control, якщо ви їх не використовуєте. Тобто не помітите як Used
Наведу повний приклад скрипта, що обробляє кліки за Scene View
Ви можете допомогти і перевести небагато коштів на розвиток сайту