【问题标题】:Serializing list of 2 dimensional arrays in UnityUnity中二维数组的序列化列表
【发布时间】:2018-03-29 16:28:04
【问题描述】:

我希望有人可以帮助序列化这个二维数组配置...本质上它会序列化所有内容,但不会序列化名为 wallConfig0...3 的二维数组。现在我有 4 个,但我想要一个可以序列化为 JSON 的 wallConfig 2d 数组列表。请给我一些关于如何序列化这个数据结构的指导。谢谢。

-瑞克

我有一个房间列表:

    [Serializable]
public class RoomDataList
{
    public List<RoomData> roomDataList = new List<RoomData>();
}

每个房间都有这个数据:

[Serializable]
    public class RoomData {
        public int[,] wallConfig0;//TODO: change to list of 2d arrays
        public int[,] wallConfig1;
        public int[,] wallConfig2;
        public int[,] wallConfig3;

    public float[] wallLoc0;//TODO: change to list of vector3
    public float[] wallLoc1;
    public float[] wallLoc2;
    public float[] wallLoc3;

    public float wallRot0;
    public float wallRot1;
    public float wallRot2;
    public float wallRot3;

    public int[,] floorConfig;
    public int parentRoomIndex;
    public int parentDoorIndex;
    public float parentDoorWallSize;
    public int roomIndex;
    public Vector3 location;
    public Quaternion rotation;
    public string filePath;
    public string[] folderContents0;
    public string[] folderContents1;
}

这是我的加载/保存到 JSON 函数:

private static RoomDataList LoadRoomData(string path) {
    string json = File.ReadAllText(path);
    return JsonUtility.FromJson<RoomDataList>(json);

}
private static void SaveRoomData(string path, RoomDataList roomDataList) {
    string json = JsonUtility.ToJson(roomDataList);

    StreamWriter sw = File.CreateText(path);
    sw.Close();
    File.WriteAllText(path, json);
}

【问题讨论】:

    标签: c# unity3d serialization


    【解决方案1】:

    不能序列化数组,但你可以用列表序列化类,所以为了序列化数组,你需要将矩阵包装到列表中,将此列表包装到类中并序列化这个类。例如:

    [System.Serializable]
    public class Cell
    {
        //some stuff
    }
    
    [System.Serializable]
    public class Array
    {
        public List<Cell> cells = new List<Cell>();
        public Cell this[int index] => cells[index];
    }
    
    [System.Serializable]
    public class Matrix
    {
        public List<Array> arrays = new List<Array>();
        public Cell this[int x, int y] => arrays[x][y];
    }
    

    不要忘记使用 this 来轻松获取数据,例如“Matrix[0,1]”

    【讨论】:

      【解决方案2】:

      很遗憾,Unity 不会自动序列化多维数组或列表。在您的情况下,一个简单的解决方法是用Vector2s 的数组替换二维数组。

      同样,在其他情况下,您可以将多维数组替换为包含任意数量变量的类/结构,然后创建此类/结构的数组。

      【讨论】:

        【解决方案3】:

        这是最终奏效的解决方案:本质上是包装器中的包装器:

        [Serializable]
        public class RoomDataList
        {
            public List<RoomData> roomDataList = new List<RoomData>();
        }
        
        [Serializable]
        public class RoomData
        {
        
            public string guid;
        
            public List<WallConfig> wallConfigList = new List<WallConfig>();
            public float[] counts;
        
            public Vector3 wallLoc0;
            public Vector3 wallLoc1;
            public Vector3 wallLoc2;
            public Vector3 wallLoc3;
        
            public float wallRot0;
            public float wallRot1;
            public float wallRot2;
            public float wallRot3;
        
            public float[] size;
        
            public string[] doorRoomGuid;
        
            public int parentRoomIndex;
            public int parentDoorIndex;
            public float parentDoorWallSize;
            public int roomIndex;
            public Vector3 location;
            public Quaternion rotation;
            public string filePath;
            public string[] folderContents0;
            public string[] folderContents1;
        }
        
        [Serializable]
        public class WallConfig {
            public List<WallFloorConfig> wallConfig=new List<WallFloorConfig>();
        }
        
        [Serializable]
        public class WallFloorConfig
        {
            public int[] wallFloorConfig;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-27
          • 2017-08-27
          • 2016-01-28
          • 2013-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多