二维布尔数组上的SerializedObject.FindProperty()返回null

时间:2018-10-24 17:12:26

标签: c# unity3d unity-editor

我目前正在Unity中使用自定义编辑器,该类具有需要设置的2D布尔数组的类。但是,每当我尝试使用SerializedObject.FindProperty()设置值时,返回的值都是null,并且会出现错误。当我尝试直接通过SerializedObject.targetObject设置它们时,布尔值仅针对该OnGui()调用而更改,而当我调用SerializedObject.ApplyModifiedProperties()时不保存,因为它知道知道它们已被更改的方式。

private void OnGUI()
{
    serializedObject.Update();

    GUILayout.Label(serializedObject.targetObject.name + " - Spawn Options", EditorStyles.boldLabel);

    EditorGUIUtility.labelWidth = 60;
    indexSize = EditorGUILayout.DelayedIntField(new GUIContent("Array Size"), indexSize, GUILayout.ExpandWidth(false));

    serializedObject.FindProperty("gameObjects").arraySize = indexSize;
    LevelGenerator target = (LevelGenerator)serializedObject.targetObject;
    target.spawnLocations = new bool[indexSize, target.areas.Count];

    EditorGUILayout.Space();


    for (int i = 0; i < indexSize; i++)
    {
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.ObjectField(serializedObject.FindProperty("gameObjects").GetArrayElementAtIndex(i));

        var labels = target.areas.Keys;
        for(int j = 0; j < target.areas.Count; j++)
        {
            target.spawnLocations[i, j] = EditorGUILayout.Toggle(labels.ElementAt(j), target.spawnLocations[i, j]);

            if(target.spawnLocations[i, j])
            {
                Debug.Log("set for one loop at least");
            }

            EditorGUILayout.PropertyField(
                serializedObject.FindProperty("spawnLocations").GetArrayElementAtIndex(i).GetArrayElementAtIndex(j), 
                new GUIContent(labels.ElementAt(j)));
        }

        EditorGUILayout.EndHorizontal();
    }

    serializedObject.ApplyModifiedProperties();
}

这是我关于StackOverflow的第一个问题,我尝试尽可能地遵循指南,但是如果在这个问题上我犯了任何错误,我道歉。

1 个答案:

答案 0 :(得分:0)

它为null的原因似乎是Unity中序列化属性的限制。例如,如果属性是一个整数数组,则它引用SerializedProperty.intValue中的第一个元素,并具有isArray,arraySize等,以使您知道它实际上是一个数组。当它是一个数组数组时,这会崩溃。因此,我能找到的最佳解决方案是将一维数组视为二维数组,虽然它不是很优雅,但是数据结构还是很抽象的。同样,为了警告所有遇到相同问题的人,API表示数组都不错,但这意味着一维数组。