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

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

Это мой код:

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



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

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

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


person s.m.m    schedule 01.05.2018    source источник


Ответы (2)


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

[System.Serializable]
public AudioClip[] ClipArray;

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

person Tom Moon    schedule 01.05.2018
comment
атрибут [Serializable] применяется только к типам, например. class или struct и не используется в отдельных полях. То, что вы упомянули, вероятно, было [SerializeField] Unity, хотя общедоступное поле в любом случае сериализуется (если в соответствии с тип Сериализуемый). Тип AudioClip уже является сериализуемым. - person derHugo; 08.01.2020

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

Если вы выберете 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();
}

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


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

person derHugo    schedule 08.01.2020