我正在尝试从编辑器窗口创建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