0

在这里,我正在尝试编写一个代码,该代码可以使用我提供的数据(如行、列和深度)为我编写和创建 JSON 文件。例如,我需要生成一个 10 x 10 x 10 的立方体。当我序列化它时,我也在代码中提供了统一检查器中的这些数据。我尝试在 for 循环中实现这一点并编写 JSON 文件。但我没有得到我想要的输出。我期望多维数据集位置不同的输出,而发生的事情是我的数据中的所有数据或多维数据集位置是我给出的数字之前的那个。也就是说,如果我将行、列和深度设为 10。所以对于整个 1000 个元素,我的数据就像 x: 9, y: 9, z:9。下面的图片更好地解释了。我知道我是在某些时候犯了错误,只是无法弄清楚在哪里。我在这里先向您的帮助表示感谢

我的期望与输出结果的图像参考

public class JSONWriter : MonoBehaviour
{
       
    [SerializeField] int rows , columns, depth = 10;
        
    [SerializeField] float padding;
        
    public enum CubeType
        
    {
            
    white,
            yellow,
            blue,
            red,
            green
        
    }

    private readonly IReadOnlyDictionary<CubeType, Color> colors = new Dictionary<CubeType, Color>
    {
        {CubeType.white, Color.white},
        {CubeType.yellow, Color.yellow},
        {CubeType.blue, Color.blue},
        {CubeType.red, Color.red},
        {CubeType.green, Color.green}
    };

    [System.Serializable]
    public class CubeData
    {
        public Vector3 cubePosition;
        public CubeType Cube;
    }
    
    [System.Serializable]
    public class CubeDataList
    {
        public CubeData[] cubeDatas;
    }

    public void outputJSON()
    {
        string strOutput = JsonUtility.ToJson(myCubeDataList);
        File.WriteAllText(Application.dataPath + "/Resources/10x10x10.txt", strOutput);
    }

    //CubeData myCubeData = new CubeData();
    public CubeDataList myCubeDataList = new CubeDataList();

    void Start()
    {
        for (int x = 0; x < myCubeDataList.cubeDatas.Length; x++)
        {
            //Debug.Log(myCubeDataList.cubeDatas.Length);
            for (int i = 0; i < depth; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    for (int k = 0; k < rows; k++)
                    {
                        myCubeDataList.cubeDatas[x].cubePosition = new Vector3(i, j, k) * padding;
                        //myCubeDataList.cubeDatas[x].Cube = Random.Range(CubeType, 3f);
                    }
                }
            }
        }
    }
}
4

1 回答 1

1

你不想i, j, k为每一个元素都经历一遍x

您所做的基本上是用i=9, j=9, k=9.


而不是一个数组,我宁愿简单地使用一个动态List

[Serializable]
public class CubeDataList
{
    public List<CubeData> cubeDatas;
}

然后通过动态添加它们

myCubeDataList.cubeDatas = new List<CubeData>(i * j * k);
   
for (int i = 0; i < depth; i++)
{
    for (int j = 0; j < columns; j++)
    {
        for (int k = 0; k < rows; k++)
        {
            var data = new CubeData();
   
            data.cubePosition = new Vector3(i, j, k) * padding;
            data.Cube = Random.Range(CubeType, 3f);

            myCubeDataList.cubeDatas.Add(data);
        }
    }
}
    

或者,如果您真的想使用数组

for (int i = 0; i < depth; i++)
{
    for (int j = 0; j < columns; j++)
    {
        for (int k = 0; k < rows; k++)
        {
            var data = new CubeData();
   
            myCubeDataList.cubeDatas[x].cubePosition = new Vector3(i, j, k) * padding;
            myCubeDataList.cubeDatas[x].Cube = Random.Range(CubeType, 3f);

            x++;
        }
    }
}
    

不过,从您之前的问题中,我知道您实际上并不想完全填满立方体!

您实际上只想要外部形状(如墙),而将立方体内部留空。

所以你真正想要的可能是

myCubeDataList.cubeDatas = new List<CubeData>(i * j * k);
   
for (int i = 0; i < depth; i++)
{
    for (int j = 0; j < columns; j++)
    {
        for (int k = 0; k < rows; k++)
        {
            if(i == 0 || i == depth - 1 
               || j == 0 || j == depth - 1
               || k == 0 || k == depth - 1)
            {
                var data = new CubeData();
                data.cubePosition = new Vector3(i, j, k) * padding;
                // TODO random enum (see below)

                myCubeDataList.cubeDatas.Add(data);
            }
        }
    }
}

对于随机枚举值,请参见例如此答案并执行

private Random random = new Random();

然后在它说// TODO插入的地方

var values = Enum.GetValues(typeof(Bar));
data.Cube = (CubeType)values.GetValue(random.Next(values.Length)); 
于 2021-06-30T08:41:04.623 回答