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