You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#读取3D数组JSON遇空值问题及Mesh创建需求

Unity解析3D浮点数组JSON失败的解决方法

问题根源

  1. Unity内置的JsonUtility不支持直接解析多维数组(包括float[][][]这类锯齿数组),这是解析后values为空的核心原因。
  2. 代码里的文件路径"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,它原生支持多维数组,代码更简洁:

  1. 打开Unity的Package Manager → 点击右上角+ → 选Add package from git URL → 输入com.unity.nuget.newtonsoft-json安装。
  2. 修改代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:22:04