https://docs.unity3d.com/ScriptReference/Editor.OnSceneGUI.html
Первое объяснение:
`Editor.OnSceneGUI()` — это метод, который используется в Unity для отображения и обработки пользовательского интерфейса (UI) в режиме редактирования сцены. Этот метод вызывается для редактора, когда происходит отрисовка элементов в окне сцены (Scene View), что позволяет добавлять свои инструменты, гизмо (gizmos) и пользовательские элементы управления, которые видны только в редакторе, а не в режиме игры.
Второе объяснение:
`OnSceneGUI` — это метод в Unity, который используется для создания [[Editor UI и Runtime UI|Editor UI]] и [[Rendering (Рендеринг, Отрисовка, Визуализация)|рендеринга]] объектов, которые доступны только при работе с Unity-редактором и не попадает в сборку игры.
> Рендеринг объектов в методе `OnSceneGUI` будет отображаться только в [[Scene View и Game View|Scene View]]
Метод `OnSceneGUI` выполняется как в **Play Mode**, так и в **Edit Mode**. Это редакторский метод, который вызывается каждый раз, когда происходит рендеринг окна сцены (`SceneView`).
`OnSceneGUI` используется только в редакторских скриптах, которые наследуют от `Editor` или `EditorWindow`.
Метод `OnSceneGUI` будет продолжать выполняться даже если вы нажмете на любое пустое место в редакторе Unity. Если окно сцены активно или отображается на экране, метод `OnSceneGUI` будет продолжать выполняться.
Если наш скрипт наследуется от `EditorWindow`, то для использования метода `OnSceneGUI` необходимо подписываться от отписываться на событие следующим образом:
```csharp
private void OnEnable()
{
// Подписываемся
SceneView.duringSceneGui += OnSceneGUI;
}
private void OnDisable()
{
// Отписываемся
SceneView.duringSceneGui -= OnSceneGUI;
}
```
При наследовании от `Editor`, подписка на событие не требуется, так как UnityEngine автоматически вызывает метод `OnSceneGUI`. Для использования метода `OnSceneGUI` достаточно его просто переопределить.
Что метод `OnSceneGUI` позволяет делать:
1. **Рисование пользовательских элементов**: Позволяет рисовать пользовательские элементы интерфейса (например, кнопки, слайдеры, текстовые поля) прямо в окне сцены.
2. **Манипуляция объектами**: Обеспечивает возможность создания пользовательских гизмо (gizmos) и манипуляторов (handles) для удобного перемещения, вращения и масштабирования объектов на сцене.
3. **Обработка событий**: Позволяет обрабатывать события ввода (например, нажатия мыши или клавиш) непосредственно в окне сцены.
Пример использования метода `OnSceneGUI`:
```csharp
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MyComponent))]
public class MyComponentEditor : Editor
{
void OnSceneGUI()
{
// Получаем ссылку на целевой компонент
MyComponent myComponent = (MyComponent)target;
// Устанавливаем цвет для рисования
Handles.color = Color.red;
// Рисуем сферу в позиции объекта
Handles.SphereHandleCap(0, myComponent.transform.position, Quaternion.identity, 1f, EventType.Repaint);
// Обработка перемещения объекта с помощью манипулятора
EditorGUI.BeginChangeCheck();
Vector3 newPosition = Handles.PositionHandle(myComponent.transform.position, Quaternion.identity);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(myComponent, "Move My Component");
myComponent.transform.position = newPosition;
}
}
}
```
В этом примере мы создаем пользовательский редактор для компонента `MyComponent`, который позволяет рисовать красную сферу в позиции объекта и перемещать его с помощью манипулятора. Этот код выполняется в режиме редактирования и помогает разработчикам настраивать и манипулировать объектами прямо в окне сцены Unity.