微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 cubePosition 数据编写一个 JSON 文件以生成一个 10x10x10 的立方体

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

Image Reference of what I'm expecting vs how my output is coming

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,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,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,k) * padding;
                // TODO random enum (see below)

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

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

private Random random = new Random();

然后是 // TODO insert

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?