Unity C#读取3D数组JSON遇空值问题及Mesh创建需求
Unity解析3D浮点数组JSON失败的解决方法
问题根源
- Unity内置的
JsonUtility不支持直接解析多维数组(包括float[][][]这类锯齿数组),这是解析后values为空的核心原因。 - 代码里的文件路径
"Assets\data\array3d.json"存在转义错误——C#中\是转义字符,会导致路径识别错误,找不到文件。
解决办法
办法1:用嵌套类适配JsonUtility
把3D数组拆成多层可序列化的嵌套类,让JsonUtility能正确映射:
public class JsonDataread : MonoBehaviour { [System.Serializable] public class DataObject { public Layer[] values; } [System.Serializable] public class Layer { public Row[] rows; } [System.Serializable] public class Row { public float[] elements; } DataObject dataObject = new DataObject(); void Start() { // 修正路径:用@前缀避免转义,或者把\改成\\ string jsonFilePath = @"Assets/data/array3d.json"; string jsonString = File.ReadAllText(jsonFilePath); dataObject = JsonUtility.FromJson<DataObject>(jsonString); // 逐元素遍历示例 if (dataObject.values != null) { foreach (var layer in dataObject.values) { foreach (var row in layer.rows) { foreach (float val in row.elements) { Debug.Log(val); } } } } } }
JSON文件不需要修改,JsonUtility会自动把数组结构映射到嵌套类中。
办法2:用Newtonsoft.Json直接解析多维数组
Unity官方支持通过Package Manager安装Newtonsoft.Json,它原生支持多维数组,代码更简洁:
- 打开Unity的Package Manager → 点击右上角
+→ 选Add package from git URL→ 输入com.unity.nuget.newtonsoft-json安装。 - 修改代码:
using Newtonsoft.Json; using System.IO; using UnityEngine; public class JsonDataread : MonoBehaviour { public class DataObject { public float[][][] values; } DataObject dataObject = new DataObject(); void Start() { string jsonFilePath = @"Assets/data/array3d.json"; string jsonString = File.ReadAllText(jsonFilePath); // 用Newtonsoft.Json解析3D数组 dataObject = JsonConvert.DeserializeObject<DataObject>(jsonString); // 逐元素访问示例 if (dataObject.values != null) { for (int i = 0; i < dataObject.values.Length; i++) { for (int j = 0; j < dataObject.values[i].Length; j++) { for (int k = 0; k < dataObject.values[i][j].Length; k++) { Debug.Log($"坐标[{i}][{j}][{k}]:{dataObject.values[i][j][k]}"); } } } } } }
后续Mesh创建示例
拿到数组数据后,可将每个子数组转为Vector3顶点,再构建Mesh:
// 假设每个内层数组是一个顶点的x/y/z坐标 List<Vector3> vertices = new List<Vector3>(); foreach (var layer in dataObject.values) { foreach (var vertexData in layer) { vertices.Add(new Vector3(vertexData[0], vertexData[1], vertexData[2])); } } // 创建Mesh并赋值顶点 Mesh mesh = new Mesh(); mesh.vertices = vertices.ToArray(); // 设置三角形索引(示例:按顺序构建三角面) int[] triangles = new int[(vertices.Count - 2) * 3]; for (int i = 0; i < vertices.Count - 2; i++) { triangles[i * 3] = i; triangles[i * 3 + 1] = i + 1; triangles[i * 3 + 2] = i + 2; } mesh.triangles = triangles; mesh.RecalculateNormals(); // 绑定到物体组件 MeshFilter meshFilter = GetComponent<MeshFilter>(); MeshRenderer meshRenderer = GetComponent<MeshRenderer>(); meshFilter.mesh = mesh; // 可给meshRenderer添加材质,比如用默认材质 meshRenderer.material = new Material(Shader.Find("Standard"));
内容的提问来源于stack exchange,提问作者user97975
相关产品推荐
相关产品推荐

