【问题标题】:How to create a custom inspector showing a list of lists in Unity?如何创建自定义检查器显示 Unity 中的列表列表?
【发布时间】:2017-04-21 12:10:58
【问题描述】:

好吧,我正在开发游戏的特定部分,我需要在其中创建列表列表、游戏关卡列表以及在每个列表节点中的触发器列表(关卡列表和其中的每个列表大小可变)。 这一切都在脚本LevelController.cs 中。 这是 Trigger 类(现在就这么简单)

[System.Serializable]
public class TriggerClass
{

    public GameObject Trigger;
    public bool Active;
    public int Type;

    public TriggerClass(GameObject obje, bool active = false, int type = 1)
    {
        Trigger = obje;
        Active = active;
        Type = type;
    }

}

还有一个用于创建级别列表的包装类

[System.Serializable]
public class WrapperClass
{
    public List<TriggerClass> Triggers = new List<TriggerClass>();
}

当然还有

public List<WrapperClass> Levels = new List<WrapperClass>();

我对两者都进行了序列化,它们在 Unity 的标准 Inspector 绘制中显示正常,但我需要自定义显示此列表的 Inspector,因此我在 Editor 文件夹中创建了 InspectorCustomizer.csEditorList.cs。 现在我只是试图模拟 Unity 对列表所做的默认绘制(一个展开箭头,一个创建该数量列表节点的大小字段,并且在每个节点中,正如我所说,发生的默认值如果您取消注释 DrawDefaultInspector 并注释 InspectorCustomizer.cs 中的其他 3 行)

InspectorCustomizer:

[CustomEditor(typeof(LevelController))]

public class InspectorCustomizer : Editor
{

    public override void OnInspectorGUI()   
    {
        //DrawDefaultInspector();

        serializedObject.Update();
        EditorList.Show(serializedObject.FindProperty("Levels"));
        serializedObject.ApplyModifiedProperties();
    }
}

这里是EditorList.cs

public static class EditorList
{
    public static void Show (SerializedProperty list)
    {
        EditorGUILayout.PropertyField(list);
        EditorGUI.indentLevel += 1;
        if (list.isExpanded)
        {
            EditorGUILayout.PropertyField(list.FindPropertyRelative("Array.size"));
            for (int i = 0; i < list.arraySize; i++)
            {
                EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i));

            }
        }
        EditorGUI.indentLevel -= 1;
    }
}

但这仅显示带有空元素的“级别”列表,我单击每个元素中的展开箭头,但没有显示任何内容,我知道会发生这种情况,因为脚本仅遍历级别列表而不是其中的每个元素,但我不知道如何遍历 Levels 列表中的每个元素以显示相同的内容。 我不太习惯序列化,如果这听起来很简单,请原谅我。

我不能在 for 循环中执行 EditorList.Show(list[i]);,因为它当然不能将索引应用于 serializedProperty,那么我该如何处理?

【问题讨论】:

    标签: c# list serialization unity3d unity5


    【解决方案1】:

    不,您不需要EditorList.cs

    EditorGUILayout.PropertyField 有一个参数includeChildren 来显示其子属性。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    
    [CustomEditor(typeof(LevelController))]
    
    public class InspectorCustomizer : Editor
    {
    
        public override void OnInspectorGUI()   
        {
            //DrawDefaultInspector();
    
            serializedObject.Update();
            EditorGUILayout.PropertyField(serializedObject.FindProperty("Levels"), true);
            serializedObject.ApplyModifiedProperties();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多