Как создать кастомный редактор (Custom Editor) в Unity?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Создание кастомного редактора в Unity
Кастомный редактор в Unity — это мощный инструмент для расширения стандартного инспектора объектов, позволяющий кастомизировать отображение и взаимодействие с компонентами, ScriptableObject или другими объектами. Это особенно полезно для создания удобных инструментов для дизайнеров, художников или геймдизайнеров.
Основные шаги создания
-
Создание класса кастомного редактора Класс должен наследоваться от
Editor(для компонентов) илиEditorWindow(для окон редактора). Для компонентов используется атрибут[CustomEditor]. -
Переопределение метода OnInspectorGUI В этом методе определяется кастомный интерфейс. Можно комбинировать стандартные элементы и кастомные поля.
-
Использование 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, делая инструмент более удобным для всей команды разработчиков.