Editor-код позволяет кастомизировать и расширять Unity-редактор.
<br>
Чтобы работать с **Editor Scripting**, нужно обязательно это делать в папке Editor (Нужно папку создать), Иначе Unity выдаст ошибку при сборке. Папок Editor может быть несколько и они могут быть в любом месте внутри папки Assets
### MenuItem
MenuItem - это атрибут, который позволяет добавлять свои кнопки в системные меню Unity-редактора
Для создания кнопки, необходимо определить статический метод.
А над этим методом указать атрибут MenuItem.
У атрибута указывается желаемое местоположение в Unity-редакторе и заодно указывается желаемое название кнопки.
```csharp
[MenuItem("GameObject/My Menu/By Button")]
public static void AddGameObject()
{
var gameObject = new GameObject();
}
```
<br>
Чтобы наша кнопка/меню появилась в контекстном меню (скрин ниже), то нужно в начале MenuItem прописать GameObject
.png)
<br>
Если в начале строки MenuItem прописать название любой вкладки, то наша кнопка/меню появится внутри вкладки (File, Editor, Assets и так далее).
-1.png)
<br>
[Официальная документация по MenuItem](https://docs.unity3d.com/ScriptReference/MenuItem.html)
<br>
### Прочее
<br>
##### Создание GameObject
Если через эдитор создаем ГМ, то нужно обязательно задавать парента.
Если не задавать парента, то при открытом префабе, может все равно его туда не добавить, а добавить просто на сцену.
Если нужно добавлять всегда ГМ только на сцену и не в какой-то родительских ГМ, то можно парента не указывать.
```csharp
var gameObject = new GameObject();
```
<br>
Если мы хотим узнать, какой GM на данный момент выделен в эдиторе
```csharp
if (Selection.activeGameObject == null)
```
<br>
Если нам нужно уничтожить Unity-объект в эдиторе, то нужно это делать через метод Object.DestroyImmediate(). Через просто Destroy() это сделать не получится.
```csharp
Object.DestroyImmediate();
```
<br>
Чтобы после работы Editor-кода (например, после добавление GM на сцену) появилась звездочка. Нужно вызвать следующий метод
-2.png)
Метод помечает Unity-объект как измененный.
```csharp
EditorUtility.SetDirty(anyUnityObject);
```
<br>
Метод регистрирует новосозданный GameObject для возможности откатить действие через cmd + z
Указанный текст используется в месте, показанный на скриншоте
-3.png)
```csharp
Undo.RegisterCreatedObjectUndo(createdGameObject, "ClarityRooms/Create Text");
```
В зависимости от того, что мы изменили через Editor-код, нужно через определенные методы (см скрин) выполнить регистрацию. Для возможности откатывать действия через cmd + z.
-4.png)
<br>
[Официальный урок от Unity по Editor-коду](https://learn.unity.com/tutorial/editor-scripting#)