Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Средства свойств можно использовать для настройки внешнего вида определенных элементов управления в окне инспектора с помощью атрибутов в ваших скриптахКусок кода, позволяющий создавать собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Подробнее
См. в Словарь
или контролируя, как конкретный Сериализуемый класс должен выглядеть.

Ящики свойств имеют два применения:

  • Настройте графический интерфейс каждого экземпляра класса Serializable.
  • Настройте графический интерфейс членов сценария с помощью настраиваемых атрибутов свойств.

Настроить графический интерфейс сериализуемого класса

Если у вас есть собственный класс Serializable, вы можете использовать Список свойств, чтобы управлять тем, как он выглядит в Inspector. Окно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в Словарь
. Рассмотрим Serializable class Ingredient в приведенных ниже примерах сценариев (Примечание: это не сценарии редактора. Классы атрибутов свойств следует помещать в обычный файл сценария):

C# (пример):

using System; using UnityEngine; enum IngredientUnit { Spoon, Cup, Bowl, Piece } // Custom serializable class [Serializable] public class Ingredient { public string name; public int amount = 1; public IngredientUnit unit; } public class Recipe : MonoBehaviour { public Ingredient potionResult; public Ingredient[] potionIngredients; }

С помощью настраиваемого ящика свойств можно изменить каждое появление класса Ingredient в инспекторе. Сравните внешний вид свойств ингредиентов в Инспекторе без пользовательского ящика свойств и с ним:

Класс в Инспекторе без (слева) и с (справа) настраиваемым ящиком свойств.
Класс в Инспекторе без (слева) и с (справа) настраиваемым ящиком свойств.

Вы можете присоединить Property Drawer к классу Serializable с помощью атрибута CustomPropertyDrawer и передать тип класса Serializable, для которого он является ящиком.

C# (пример):

using UnityEditor; using UnityEngine; // IngredientDrawer [CustomPropertyDrawer(typeof(Ingredient))] public class IngredientDrawer : PropertyDrawer { // Draw the property inside the given rect public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // Using BeginProperty / EndProperty on the parent property means that // prefab override logic works on the entire property. EditorGUI.BeginProperty(position, label, property); // Draw label position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); // Don't make child fields be indented var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; // Calculate rects var amountRect = new Rect(position.x, position.y, 30, position.height); var unitRect = new Rect(position.x + 35, position.y, 50, position.height); var nameRect = new Rect(position.x + 90, position.y, position.width - 90, position.height); // Draw fields - passs GUIContent.none to each so they are drawn without labels EditorGUI.PropertyField(amountRect, property.FindPropertyRelative("amount"), GUIContent.none); EditorGUI.PropertyField(unitRect, property.FindPropertyRelative("unit"), GUIContent.none); EditorGUI.PropertyField(nameRect, property.FindPropertyRelative("name"), GUIContent.none); // Set indent back to what it was EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); } }

Настройка графического интерфейса членов скрипта с помощью атрибутов свойств

Еще одно применение Списка свойств — изменение внешнего вида элементов в скрипте, которые имеют настраиваемые атрибуты свойств. Допустим, вы хотите ограничить числовые значения с плавающей запятой или целые числа в своем скрипте определенным диапазоном и отобразить их в виде ползунков в Инспекторе. Используя встроенный PropertyAttribute, называемый RangeAttribute, вы можете сделать это:

C# (пример):

// Show this float in the Inspector as a slider between 0 and 10 [Range(0f, 10f)] float myFloat = 0f;

Вы также можете создать свой собственный PropertyAttribute. Мы будем использовать код для RangeAttribute в качестве примера. Атрибут должен расширять класс PropertyAttribute. При желании ваше свойство может принимать параметры и сохранять их как общедоступные переменные-члены.

C# (пример):

using UnityEngine; public class MyRangeAttribute : PropertyAttribute { readonly float min; readonly float max; void MyRangeAttribute(float min, float max) { this.min = min; this.max = max; } }

Теперь, когда у вас есть атрибут, вам нужно создать Список свойств, отображающий свойства, имеющие этот атрибут. Ящик должен расширять класс PropertyDrawer и должен иметь атрибут CustomPropertyDrawer, чтобы указать, для какого атрибута он является ящиком.

Класс панели свойств должен быть помещен в сценарий редактора в папку с именем Editor.

C# (пример):

using UnityEditor; using UnityEngine; // Tell the MyRangeDrawer that it is a drawer for properties with the MyRangeAttribute. [CustomPropertyDrawer(typeof(MyRangeAttribute))] public class RangeDrawer : PropertyDrawer { // Draw the property inside the given rect void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // First get the attribute since it contains the range for the slider MyRangeAttribute range = (MyRangeAttribute)attribute; // Now draw the property as a Slider or an IntSlider based on whether it's a float or integer. if (property.propertyType == SerializedPropertyType.Float) EditorGUI.Slider(position, property, range.min, range.max, label); else if (property.propertyType == SerializedPropertyType.Integer) EditorGUI.IntSlider(position, property, (int) range.min, (int) range.max, label); else EditorGUI.LabelField(position, label.text, "Use MyRange with float or int."); } }

Обратите внимание, что из соображений производительности функции EditorGUILayout нельзя использовать с ящиками свойств.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3