使用 cubePosition 数据写入一个 JSON 文件以生成一个 10x10x10 的立方体

Write a JSON file with cubePosition Data to spawn a 10x10x10 cube

在这里,我正在尝试编写一个代码,该代码可以使用我提供的行、列和深度等数据为我编写和创建一个 JSON 文件。 例如,我需要生成一个 10 x 10 x 10 的立方体。当我序列化它时,我也在代码中在 unity Inspector 中提供了这些数据。 我尝试在 for 循环中实现这一点并编写 JSON 文件。但我没有得到我想要的输出。我期待立方体位置不同的输出,而实际发生的是我数据中的所有数据或立方体位置是我给出的数字之前的位置。也就是说,如果我将我的行、列和深度设置为 10。所以我的数据就像 x: 9, y: 9, z:9 对于整个 1000 elements.Better 解释如下图 below.I 知道我在某些时候犯了一个错误,只是无法弄清楚在哪里。感谢您提前的帮助

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);
                    }
                }
            }
        }
    }
}

您不想遍历每个元素的所有 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);
            }
        }
    }
}

对于随机枚举值,请参见例如this answer 并做

private Random random = new Random();

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

var values = Enum.GetValues(typeof(Bar));
data.Cube = (CubeType)values.GetValue(random.Next(values.Length));