Найти тему
cosyplaid

[EXP] Unity 3D кастомный Inspector малой кровью. Атрибуты для инспектора.

Оглавление

Приветствую всех ценителей движка Юнити!

Вступление

Окно инспектора является одной из наиболее базированных вещей в Unity, ведь благодаря ему мы можем лицезреть и настраивать присущие конкретному объекту компоненты или же другие составляющие движка: модели, звуки, текстуры, материалы и т.д.

В общем, инспектором мы пользуемся часто. А по сути своей это то, как движок технически и визуально представляет нам классы типа MonoBehaviour и ScriptableObject.

Иногда мы хотим сделать инспектор нашего скрипта более персонализированным, чтобы систематизировать его свойства или же реализовать новый функционал. Это может значительно упростить работу в редакторе (особенно в команде), так как сокращается необходимость каждый раз лазить под "капот", с целью узнать за что может отвечать та или иная переменная. Или же люди, не связанные с кодом (геймдизайнеры, художники, саунд-дизайнеры), могут работать со скриптом на уровне пользователя. Добиться этого мы можем при помощи API (UnityEngine, UnityEditor) и атрибутов.

В данной же статье я хочу поделиться опытом создания кастомного инспектора наиболее простым способом - только с использованием атрибутов.

Атрибуты в юнити определяют "поведение" классов/свойств и заключаются в квадратные скобки. Если нужно указать несколько атрибутов за раз, то они перечисляются через запятую: [attribute1, attribute2, attribute3].

Примеры использования атрибутов

Я создал тестовый скрипт в Юнити, в котором указаны наиболее частые атрибуты. Ниже вкратце опишу их суть, а для удобства повествования разделю на группы.

Тестовый скрипт с атрибутами
Тестовый скрипт с атрибутами

Вот как выглядит скрипт с атрибутами в инспекторе:

Отображение скрипта в инспекторе
Отображение скрипта в инспекторе

Атрибуты класса:

• AddComponentMenu("Вкладка/Название скрипта") - добавляет скрипт в меню компонентов.

AddComponentMenu
AddComponentMenu

• RequireComponent(typeof(Компонент)) - автоматически добавляет требуемый компонент объекту вместе с скриптом.

• SelectionBase - при нажатии на дочерние объекты движок будет выделять родительский (на котором висит скрипт).

Визуальные атрибуты:

• Header("Заголовок") - создает заголовок перед группой переменных.

• Space(Величина отступа) - добавляет отступ после переменной

Атрибуты для свойств:

• Tooltip("Текст подсказки") - показывает подсказку при наведении мышкой.

Tooltip
Tooltip

• SerializeField - отображает приватную переменную в инспекторе.

• HideInInspector - скрывает публичную переменную в инспекторе.

• TextArea - используется для string переменных. Добавляет поле для текста.

• Multiline - используется для string переменных. Добавляет поле для текста.

Функциональные атрибуты:

• ContextMenuItem("Название", "Метод в скрипте", order = порядковый номер) - вызывается контекстное меню при нажатии правой кнопки мыши.

ContextMenuItem
ContextMenuItem

• Range(от, до) - отображает слайдер для int или float.

• System.Serializable - помечает классы и структуры для их сериализации. Указав данный атрибут можно создать лист из Struct и редактировать его прямо в инспекторе.

Serializable
Serializable

Заключение

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

Старался не перегружать статью сложными терминами и надеюсь она окажется кому-то полезной. Если вы знаете какие еще атрибуты можно использовать на практике, был бы рад обмену опытом.

Благодарю за внимание) Удачного игростроения!