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

Как создать кастомный редактор (Custom Editor) в Unity?

2.0 Middle🔥 142 комментариев
#Unity Core

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

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

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

Создание кастомного редактора в Unity

Кастомный редактор в Unity — это мощный инструмент для расширения стандартного инспектора объектов, позволяющий кастомизировать отображение и взаимодействие с компонентами, ScriptableObject или другими объектами. Это особенно полезно для создания удобных инструментов для дизайнеров, художников или геймдизайнеров.

Основные шаги создания

  1. Создание класса кастомного редактора Класс должен наследоваться от Editor (для компонентов) или EditorWindow (для окон редактора). Для компонентов используется атрибут [CustomEditor].

  2. Переопределение метода OnInspectorGUI В этом методе определяется кастомный интерфейс. Можно комбинировать стандартные элементы и кастомные поля.

  3. Использование SerializedObject Для корректной работы с сериализацией и отменой действий (Undo) рекомендуется использовать SerializedObject и SerializedProperty.

Пример кастомного редактора для компонента

Допустим, у нас есть компонент Health:

using UnityEngine;

public class Health : MonoBehaviour
{
    public float maxHealth = 100f;
    public float currentHealth = 100f;
    public bool isInvincible = false;
}

Создаём кастомный редактор в отдельном файле в папке Editor:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Health))]
public class HealthEditor : Editor
{
    private SerializedProperty maxHealthProp;
    private SerializedProperty currentHealthProp;
    private SerializedProperty isInvincibleProp;

    private void OnEnable()
    {
        // Инициализация SerializedProperty
        maxHealthProp = serializedObject.FindProperty("maxHealth");
        currentHealthProp = serializedObject.FindProperty("currentHealth");
        isInvincibleProp = serializedObject.FindProperty("isInvincible");
    }

    public override void OnInspectorGUI()
    {
        // Начало обновления свойств
        serializedObject.Update();

        // Отображение полей с помощью SerializedProperty
        EditorGUILayout.PropertyField(maxHealthProp);
        EditorGUILayout.PropertyField(currentHealthProp);
        EditorGUILayout.PropertyField(isInvincibleProp);

        // Визуальный индикатор здоровья
        Health health = (Health)target;
        float healthPercentage = health.currentHealth / health.maxHealth;
        Rect progressRect = GUILayoutUtility.GetRect(200, 20);
        EditorGUI.ProgressBar(progressRect, healthPercentage, "Health");

        // Кнопка для восстановления здоровья
        if (GUILayout.Button("Restore Full Health"))
        {
            health.currentHealth = health.maxHealth;
            EditorUtility.SetDirty(target);
        }

        // Применение изменений
        if (serializedObject.ApplyModifiedProperties())
        {
            // Если свойства изменились, помечаем объект как изменённый
            EditorUtility.SetDirty(target);
        }
    }
}

Ключевые особенности

  • Папка Editor: Все классы редакторов должны находиться в папке Editor, иначе они не будут скомпилированы в финальной сборке.
  • Атрибут [CustomEditor]: Указывает, для какого типа объектов предназначен редактор. Можно использовать [CustomEditor(typeof(Health), true)], где true включает отображение для производных классов.
  • SerializedObject: Обеспечивает корректную работу с системой сериализации Unity, включая Undo/Redo и многое другое.
  • Метод OnEnable: Вызывается при активации редактора, идеальное место для инициализации SerializedProperty.
  • EditorGUILayout и EditorGUI: Содержат множество готовых элементов интерфейса (поля, слайдеры, кнопки).

Расширенные возможности

  • Кастомные атрибуты: Можно создавать свои атрибуты для управления отображением полей.
  • Редакторы для ScriptableObject: Аналогичным образом создаются редакторы для ScriptableObject, что полезно для данных конфигурации.
  • Окна редактора (EditorWindow): Для создания отдельных окон инструментов, например, для управления игровыми уровнями.

Рекомендации

  • Всегда используйте SerializedObject для работы со свойствами — это обеспечивает корректную работу Undo и Prefab системы.
  • Для сложных редакторов разбивайте интерфейс на логические секции с помощью EditorGUILayout.Space(), EditorGUILayout.LabelField().
  • Используйте EditorGUI.BeginDisabledGroup() для временного отключения групп элементов.
  • Помните о производительности — не выполняйте тяжелые вычисления в OnInspectorGUI, который вызывается часто.

Кастомные редакторы значительно упрощают работу с данными в Unity, делая инструмент более удобным для всей команды разработчиков.