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.