Как можно добавить кнопку в элемент массива в UnityEditor?

Привет всем! Я работаю над размещением кнопки в моем AnimationData, который использует кастомный PropertyDrawer. Хотелось бы, чтобы эта кнопка корректно отображалась в объекте AnimatedObject, который содержит список таких AnimationData. Однако в данный момент она отображается вот так: <br/><br/>
  • 9 декабря 2024 г. 12:23
Ответы на вопрос 2
Чтобы добавить кнопку в элемент массива в Unity Editor с использованием кастомного `PropertyDrawer`, вы можете сделать следующее. Я предоставлю вам пример, который поможет вам понять, как это реализовать.

1. **Создайте класс AnimationData** с вашим массивом.
2. **Создайте кастомный PropertyDrawer** для AnimationData.
3. **Отобразите массив и добавьте кнопку** для каждого элемента массива.

Вот пример кода, который иллюстрирует этот процесс:

```csharp
using UnityEngine;
using UnityEditor;

[System.Serializable]
public class AnimationData
{
    public string name;
    // Другие параметры анимации
}

[CustomPropertyDrawer(typeof(AnimationData))]
public class AnimationDataDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        // Обозначим свойства, которые хотим отображать
        SerializedProperty nameProperty = property.FindPropertyRelative("name");

        // Отображаем текстовое поле для имени
        position.height = EditorGUIUtility.singleLineHeight;
        EditorGUI.PropertyField(position, nameProperty);

        position.y += position.height + 2; // Сдвигаем позицию вниз

        // Создаем кнопку
        if (GUI.Button(position, "My Button"))
        {
            // Действие при нажатии кнопки
            Debug.Log($"Button clicked for AnimationData: {nameProperty.stringValue}");
        }
    }

    public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
    {
        return EditorGUIUtility.singleLineHeight * 2 + 4; // Высота для текстового поля и кнопки
    }
}

public class AnimatedObject : MonoBehaviour
{
    public AnimationData[] animations;
}
```

### Объяснение кода:
1. **Класс AnimationData** — это ваш класс данных, содержащий анимационные параметры.
2. **Класс AnimationDataDrawer**:
   - `OnGUI` — здесь мы определяем, как будет выглядеть ваш кастомный интерфейс. Мы используем `SerializedProperty`, чтобы получить доступ к полям в `AnimationData`.
   - Мы создаем текстовое поле для имени анимации и добавляем кнопку под ним.
   - По нажатию кнопки выполняется действие (в данном случае — вывод сообщения в консоль).
3. **Высота свойства** (`GetPropertyHeight`) устанавливает, сколько места займут вводимые элементы в редакторе.

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