AssetDatabase
В любой момент создания редакторов вам может понадобиться необходимость использовать ресурсы из проекта. При том - любой ресурс, а не конкретно те, что лежат в папке "/Resources/". Да и мало того, может понадобиться возможность их сохранять.
Для таких целей в Unity предусмотрен класс AssetDatabase. Его возможности довольно-таки широки, и, возможно, стоят даже отдельной статьи, объясняющей разные фичи/баги.
Handles
Вы можете рисовать в сцене и мало того, пользоваться своими манипуляторами, которые позволят визуально редактировать ваш объект (например, именно так устроены стандартные инструменты позиционирования/поворота/масштабирования).
Так, например, CustomEditor поддерживает метод OnSceneGUI, который позволяет рисовать такие штуковины (например при помощи класса Handles).
По этой теме, я опять же считаю, что должна существовать некоторая отдельная статья. Это очень большая тема, о которой можно рассказать значительно больше одной страницы.
InitializeOnLoad
Часто возникают ситуации, когда нам нужно запустить какой-либо скрипт сразу при изменении кода, или при старте редактора, то есть в тот момент, когда сборка только что была загружена.
Для этих целей нам пригодится атрибут [InitializeOnLoad], которым мы можем пометить любой статический класс, и в этом случае его статический конструктор запустится именно так, как я и написал выше.
[InitializeOnLoad] public static class MyEditorInit { static MyEditorInit() { //Здесь наш код } }
Данный метод в основном применяется в таких ситуациях, как, например, автогенерация кода или подписка на делегаты, о некоторых из которых речь пойдет ниже.
По делегатам
update:
Часто бывает, что в редакторе требуется заюзать апдейт, но сделать это просто неоткуда. В таком случае вам поможет делегат EditorApplication.update. И подписываемся мы на него через описанный выше способ.
[InitializeOnLoad] public static class MyEditorInit { static MyEditorInit() { EditorApplication.update += Update; } static void Update() { //Код апдейта } }
Важно понимать, что этот метод вызывается приблизительно 100 раз в секунду, и нужно это учитывать при обдумывании его тела.
hierarchyWindowItemOnGUI:
Нельзя обойти стороной делегат EditorApplication.hierarchyWindowItemOnGUI, позволяющий дорисовать объекты в иерархии.
Например, в проекте заказчика я использовал его для быстрого создания объектов:
Подписка этого делегата должна осуществляться на метод с параметрами, как здесь:
static void HierarchyWindowItemOnGui(int instanceId, Rect selectionRect)
windowChanged
Порой необходимо отследить моменты, когда в иерархии или папке проекта что-то поменялось.
Для этого есть два чудесных делегата - EditorApplication.hierarchyWindowChanged и EditorApplication.projectWindowChanged.
sceneView
Для того, чтобы раскрашивать сцену при помощи методов класса Handles можно создавать методы, не привязанные к конкретным объектам и окнам. Делается это при помощи делегата SceneView.onSceneGUIDelegate
Это, конечно, не все делегаты - вы их еще море найдете. Я написал лишь те, которые юзаются чаще остальных.
Unsupported
Вы никогда не увидите этого класса в документации Unity, но тем не менее он содержит очень много полезных методов. Однако, будьте осторожны - ведь методы могут измениться с новой версией движка.
На этом базовый курс по написанию редакторов для Unity я считаю закрытым. Все свободны, можете идти :)Смотрите также:
Комментарии
Здесь еще никто не оставил комментарий
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]