带有伪造的二维列表的嵌套类错误“ ArgumentOutOfRangeException”

时间:2019-06-27 06:47:15

标签: c# unity3d serialization

我正在尝试从编辑器窗口创建2d列表/数组,并在运行时在脚本中使用该数据。据我所知,这很困难,因为2d类型没有被Unity序列化。因此,我尝试制作一个嵌套类来“模拟”假的2d列表。 我想我可以做到这一点,但是我得到的错误是我的索引超出了函数“ PrintBoolAndSaveState”中类“ tileMapDepth”的大小。

我已经尝试过使用数组,但是很难更新大小,并且在引用“ tileMapDepth [0] .tileMapWidth.Count”时遇到很多麻烦,因为它不认为外部列表中存在元素

[System.Serializable]
public class tileMapDepth //Fake2DArray :| 
{
    public List<bool> tileMapWidth;

    public tileMapDepth(List<bool> realWidth)
    {
        this.tileMapWidth = realWidth;
    }
}
public class PathEditorWindow : EditorWindow
{
    public int width = 1;
    public int depth = 1;

    public bool overrideCurrentPath = false;
    public List<tileMapDepth> tileMap = new List<tileMapDepth>(0)
    {
        new tileMapDepth(new List<bool>(1))
    };

    [MenuItem("Building/PathCreator")]

    public static void CreateEditorWindow()
    {
        EditorWindow.GetWindow<PathEditorWindow>();
    }

    public void OnGUI()
    {
        GUILayout.Label("Manually create a path by hand! :>", EditorStyles.boldLabel);
        GUILayout.Label("1. Choose dimensions of your tilemap: ", EditorStyles.boldLabel);
        width = EditorGUILayout.IntField("Width", width);
        depth = EditorGUILayout.IntField("Depth", depth);
        GUILayout.Label("2. Choose which tiles should have a path on it: ", EditorStyles.boldLabel);

        UpdateFake2DList();
        PrintBoolAndSaveState();
        EditorGUILayout.BeginHorizontal();

        GUILayout.Label("3. Choose if the new applied path should override the current: ", EditorStyles.boldLabel);
        EditorGUILayout.EndHorizontal();

        if (GUILayout.Button("Yes"))
        {
            //DebuggerFunction();
            UpdateFake2DList();
            overrideCurrentPath = true;
            Debug.Log("A fresh path has been created manually!, hope its guud");
        }

        if (GUILayout.Button("No"))
        {
            UpdateFake2DList();
            overrideCurrentPath = false;
        }
    }

    private void PrintBoolAndSaveState()
    {
        for (int j = depth - 1; j >= 0; j--)
        {
            EditorGUILayout.BeginHorizontal();
            for (int i = 0; i < width; i++)
            {
                tileMap[j].tileMapWidth[i] = EditorGUILayout.Toggle(tileMap[j].tileMapWidth[i]);
            }
            EditorGUILayout.EndHorizontal();

        }
    }




    public void UpdateFake2DList()
    {
        if (depth != tileMap.Count || (width != tileMap[0].tileMapWidth.Count && tileMap.Count > 0))
        {
            //tileMap.Capacity = depth;

            for (int i = depth - 1; i >= 0; i--)
            {
                tileMap.Add(new tileMapDepth(new List<bool>(width)));
                for (int j = 0; j < width; j++)
                {
                    tileMap[j].tileMapWidth.AddRange(new List<bool>(width));
                }

            }
        }
    }
}

我希望能够为内部和外部列表中的元素设置值。但是显然它们不存在。

错误:ArgumentOutOfRangeException:索引超出范围。必须为非负数并且小于集合的大小。 参数名称:索引

这是编辑器窗口在Unity中的外观图。在步骤2下,应该有宽度*深度nr的布尔值。 Editor Window

0 个答案:

没有答案