Разширяване на функционалността на Scene View в Unity3D

За да можете да пишете скриптове, които работят в изгледа Scene, първо, класът, с който работите, трябва да бъде наследен от Editor или EditorWindow, което предполага включването на пространство от имена UnityEditor. Това дава достъп до няколко "магически" Unity3D метода като OnGUI() и OnSceneGUI(). Методът OnSceneGUI позволява на редактора да контролира събитията за изглед на сцена.

Да се ​​върнем към прихващането на събития. Идеята е да обозначим обекта, за който разработваме функционалност като елемент от интерфейса на Unity, наравно с етикет или бутон от IMGUI.

API има клас Event, който се използва за различни GUI събития, като натискане на клавиши, бутони на мишката, събития за изобразяване и събития за оформление на Unity.

В допълнение към събитието, за да прихванете кликвания, имате нужда от нещо като контрол. Всеки IMGUI елемент може да действа като контрола в Unity. Например бутон или етикет. За да може вашият обект да прихване щракването, трябва да кажете на Unity, че той също е контрол и ще участва в обработката на събития. За да направим това, ще използваме класа GUIUtility. Всяка контрола трябва да има свой собствен уникален идентификатор, с който Unity ще получи цялата необходима информация за нея. id е int, но имайте предвид, че трябва да е уникален. Можете да генерирате произволно число (различно от 0) и да го считате за идентификатор на вашата контрола, но няма гаранция, че вече няма контрола със същия идентификатор в системата и в този случай щракването ще отиде до грешния елемент, който сте очаквали. За да създадете уникален идентификатор, използвайте метода от класа GUIUtility

Параметърът, приет като вход от този метод, е отговорен за способността на контрола да получава всеки вход от клавиатурата. Информация за него можете да намерите вдокументация. Тъй като не се изисква въвеждане от клавиатурата при използване на изглед на сцена, FocusType.Passive ще свърши работа.

Сега, след като се справихме с получаването на идентификатор, е време да се заемем с прихващането на събития. Можем да получим информация за текущото събитие чрез свойството Event.current. За да получите типа събитие, което се е случило в Unity, трябва да направите следното

Това извикване ще върне стойност EventType за нашата контрола. След това просто трябва да решите кои събития имате нужда и да ги прихванете. Директното прихващане на събитието се извършва по следния начин

В случай на щракване с мишката, това ви казва, че вашата контрола е "гореща", т.е. тя ще реагира първо на събития с мишката и те няма да отидат по-нататък към други контроли. Този аспект е описан подробно в документацията. За да върнете достъпа до събития с мишката до други контроли, трябва да направите

Това ще ви каже, че следните събития на мишката могат да бъдат прихванати от всеки друг контрол. Освен това събитията ще бъдат достъпни за други контроли, ако не ги използвате. Тоест да не се отбелязва като Използвано

Ще дам пълен пример за скрипт, който обработва щраквания върху Scene View

Можете да помогнете и да прехвърлите средства за развитието на сайта