Показать массив в Инспекторе (Unity)

У меня есть список массивов, которые я хочу показать в инспекторе

Это мой код:

        SerializedProperty ClipArray;
        ClipArray = serializedObject.FindProperty("ClipArray"); // public AudioClip[] ClipArray;



        serializedObject.Update();
        EditorGUILayout.PropertyField(ClipArray);
        serializedObject.ApplyModifiedProperties();

Но в инспекторе я показываю массив без параметров

введите описание изображения здесь

1 ответ

Вы пытались поместить системный сериализуемый выше сценария, когда вы объявляете свой массив?

[System.Serializable]
public AudioClip[] ClipArray;

Какие-либо из значений в вашем массиве изначально установлены в нуль?

Это довольно известная проблема с массивами / списками в пользовательских редакторах.

Если вы оформляете заказ EditorGUILayout.PropertyField вы увидите, что есть перегрузки, принимающие параметр

includeChildren
Еслиtrueнарисовано имущество, в том числе дети; в противном случае только сам элемент управления (например, только разворот, но ничего под ним).

так что на самом деле все, что вам нужно сделать, это передать true подобно

SerializedProperty ClipArray;

// I would always do these only once ;)
private void OnEnable()
{
    ClipArray = serializedObject.FindProperty("ClipArray");
}

private void OnInspectorGUI ()
{
    serializedObject.Update();
    EditorGUILayout.PropertyField(ClipArray, true);
    serializedObject.ApplyModifiedProperties();
}

В качестве альтернативы вы можете, конечно, также самостоятельно построить всю иерархию рисования с обязательными полями:

private void OnInspectorGUI ()
{
    serializedObject.Update();

    ClipArray.isExpanded = EditorGUILayout.Foldout(ClipArray.isExpanded, ClipArray.name);
    if(ClipArray.isExpanded)
    {
        EditorGUI.indentLevel++;

        // The field for item count
        ClipArray.arraySize = EditorGUILayout.IntField("size", ClipArray.arraySize);

        // draw item fields
        for(var i = 0; i< ClipArray.arraySize; i++)
        {
            var item = ClipArray.GetArrayElementAtIndex(i);
            EditorGUILayout.PropertyField(item, new GUIContent($"Element {i}");
        }

        EditorGUI.indentLevel--;
    }
    serializedObject.ApplyModifiedProperties();
}

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


Примечание: набрано на смартфоне (→ могут быть ошибки), но я надеюсь, что идея прояснится

Другие вопросы по тегам