← Назад к вопросам

Что такое Editor Window и PropertyDrawer в Unity? Для чего они используются?

2.2 Middle🔥 142 комментариев
#C# и ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ: Editor Window и PropertyDrawer в Unity

В Unity, Editor Window и PropertyDrawer — это два ключевых инструмента для расширения редактора Unity, которые позволяют кастомизировать интерфейс и улучшить рабочий процесс разработчиков. Они относятся к Unity Editor API и используются для создания более удобных инструментов, особенно при работе со сложными данными или специализированными системами.

Что такое Editor Window?

Editor Window — это пользовательское окно в редакторе Unity, которое можно создать для отображения дополнительных инструментов, панелей управления или визуализаций. Оно позволяет разработчикам создавать собственные интерфейсы, аналогичные стандартным окнам, таким как Inspector или Scene View.

  • Для чего используется: Editor Window применяется для задач, которые не умещаются в стандартный Inspector, например:
    *   Создание редакторов уровней или карт.
    *   Управление настройками проекта или конфигурацией геймплея.
    *   Визуализация и отладка сложных систем (например, AI-графов, диалоговых деревьев).
    *   Автоматизация повторяющихся задач (пакетирование ассетов, генерация данных).

Для создания своего окна необходимо наследоваться от класса EditorWindow и определить его содержимое в методе OnGUI() или, в более новых версиях Unity, с использованием UIElements в CreateGUI().

Пример простого Editor Window:

using UnityEditor;
using UnityEngine;

public class MyToolWindow : EditorWindow
{
    private string myText = "Hello";

    // Меню для открытия окна
    [MenuItem("Tools/My Custom Window")]
    public static void ShowWindow()
    {
        GetWindow<MyToolWindow>("My Tool");
    }

    void OnGUI()
    {
        // Поле ввода в окне
        myText = EditorGUILayout.TextField("Input Field", myText);

        if (GUILayout.Button("Generate"))
        {
            Debug.Log($"Generating: {myText}");
            // Логика генерации...
        }
    }
}

Что такое PropertyDrawer?

PropertyDrawer — это механизм для кастомизации отображения отдельных полей (свойств) в Inspector Unity. Он позволяет переопределить стандартный способ отрисовки поля для определенного типа данных или атрибута, делая инспектор более наглядным и удобным.

  • Для чего используется: PropertyDrawer идеально подходит для:
    *   Создания более интуитивных редакторов для пользовательских структур (`struct`) или классов.
    *   Визуализации сложных данных (например, диапазонов, цветов в определенном формате, статусов).
    *   Добавления валидации или подсказок прямо в поле инспектора.
    *   Применения **атрибутов** (например, `[Range]`, `[Header]`) для управления отображением.

PropertyDrawer связывается с определенным типом или атрибутом и определяет, как он будет выглядеть в инспекторе.

Пример PropertyDrawer для пользовательской структуры:

// Пользовательская структура данных
[System.Serializable]
public struct DamageRange
{
    public float minDamage;
    public float maxDamage;
}

// PropertyDrawer для этой структуры
[CustomPropertyDrawer(typeof(DamageRange))]
public class DamageRangeDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        EditorGUI.BeginProperty(position, label, property);

        // Рисуем заголовок
        position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);

        var indent = EditorGUI.indentLevel;
        EditorGUI.indentLevel = 0;

        // Получаем ссылки на сериализованные поля
        var minProp = property.FindPropertyRelative("minDamage");
        var maxProp = property.FindPropertyRelative("maxDamage");

        float width = position.width / 2 - 5;
        Rect minRect = new Rect(position.x, position.y, width, position.height);
        Rect maxRect = new Rect(position.x + width + 10, position.y, width, position.height);

        // Рисуем два поля рядом: Min и Max
        EditorGUI.PropertyField(minRect, minProp, GUIContent.none);
        EditorGUI.PropertyField(maxRect, maxProp, GUIContent.none);

        EditorGUI.indentLevel = indent;
        EditorGUI.EndProperty();
    }
}

Ключевые различия и когда что использовать:

  • Editor Window — это самостоятельное окно. Используйте его, когда нужен отдельный, возможно, большой или комплексный инструмент, не привязанный к конкретному объекту (например, менеджер проекта, генератор мира).
  • PropertyDrawer — это часть инспектора. Используйте его, когда нужно улучшить отображение конкретного поля внутри компонента или ScriptableObject, чтобы сделать его редактирование более понятным и безопасным.

В своей практике я часто комбинирую оба подхода: PropertyDrawer — для удобства настройки отдельных параметров непосредственно на префабах или объектах, а Editor Window — для глобального управления контентом и автоматизации процессов. Например, система диалогов может иметь удобный PropertyDrawer для редактирования одной реплики и мощный Editor Window для визуального построения всего дерева диалогов. Это значительно ускоряет итерацию разработки и снижает количество ошибок.

Что такое Editor Window и PropertyDrawer в Unity? Для чего они используются? | PrepBro