【发布时间】: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.cs 和 EditorList.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