如何在Unity中创建显示列表列表的自定义检查器?

时间:2016-12-06 18:32:54

标签: c# list serialization unity3d unity5

好吧,我正在开发一个游戏的特定部分,我需要在其中创建列表列表,游戏关卡列表以及每个列表节点中的触发器列表(关卡列表及其中的每个列表)大小可变)。 这一切都在脚本[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; } } 中。 这是Trigger类(现在就像这样简单)

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

用于创建级别列表的包装类

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

当然

InspectorCustomizer.cs

我将它们序列化,并且它们在Unity中的标准Inspector绘图中显示正常,但我需要自定义显示此列表的Inspector,因此我在Editor文件夹中创建了EditorList.cs[CustomEditor(typeof(LevelController))] public class InspectorCustomizer : Editor { public override void OnInspectorGUI() { //DrawDefaultInspector(); serializedObject.Update(); EditorList.Show(serializedObject.FindProperty("Levels")); serializedObject.ApplyModifiedProperties(); } } 。 现在我只是试图模拟Unity对列表执行的默认绘制(扩展箭头,创建列表节点数量的大小字段,并且在每个节点中都是相同的事情,正如我所说,发生的默认值如果取消注释DrawDefaultInspector并在InspectorCustomizer.cs中注释其他3行)

InspectorCustomizer:

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; } }

EditorList.Show(list[i]);

但是这只是显示带有空元素的“Levels”列表,我点击每个元素中的expandd箭头并且没有显示任何内容,我知道这是因为脚本只是通过Levels列表而不是每个元素内部迭代,但我不知道如何遍历Levels列表中的每个元素以显示相同的内容。 我真的不习惯序列化,所以请原谅我,如果这听起来很容易。

我无法在for循环中执行var fs = require('fs'); var exec = require('child_process').exec; var cmd = 'echo $(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)'; exec(cmd, function(error, stdout, stderr) { fs.writeFile("src/test.js", stdout, function(err) { if(err) return console.log(err); console.log(stdout); }); }); 因为它当然无法将索引应用于serializedProperty,所​​以我该如何处理?

1 个答案:

答案 0 :(得分:0)

不,你不需要private List<string> serchForElement(string searchText, list<string> ListOfitems) { searchText = searchText.ToLower(); List<string> Newlist = (from items in ListOfitems where items.ToLower().Contains(searchText.ToLower()) select items).ToList<string>();

Demonstration Image

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

includeChildren