在Inspector(Unity)中显示数组

时间:2018-05-01 08:05:09

标签: c# unity3d inspector

我有一个我想在检查器中显示的数组列表

这是我的代码:

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



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

但是在检查器中,我显示了一个没有参数的数组

enter image description here

2 个答案:

答案 0 :(得分:2)

您是否尝试在声明阵列时将系统序列化置于脚本之上?

[System.Serializable]
public AudioClip[] ClipArray;

数组中的任何值最初都设置为null吗?

答案 1 :(得分:0)

这是自定义编辑器中数组/列表的一个众所周知的问题。

如果您检出EditorGUILayout.PropertyField,则会看到带有参数的重载

包括儿童
如果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();
}

我就把它留在这里,因为手动构建这类东西曾经对我帮助很多人了解编辑器是如何工作的。


注意:在智能手机上键入(→可能会有错误),但我希望这个想法能弄清楚