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

Unity新手求助:用SerializableDictionary存Mesh为空,不知调用指定方法

解决SerializableDictionary保存Mesh为空的问题

核心原因

Unity的Mesh对象无法直接被完整序列化——直接存入SerializableDictionary时,只有Mesh的引用信息会被记录,顶点、三角面等核心几何数据不会被写入存档,最终导致存档里的值为空。

解决方案

1. 封装可序列化的Mesh数据结构

先写一个能被Unity序列化的类,专门存储Mesh的关键数据:

[Serializable]
public class SerializedMeshData
{
    public Vector3[] vertices;
    public int[] triangles;
    public Vector2[] uv;
    public Vector3[] normals;
    // 按需添加切线、顶点颜色等你需要保存的数据

    // 从Mesh转换为可序列化数据
    public static SerializedMeshData FromMesh(Mesh mesh)
    {
        if (mesh == null) return null;

        var data = new SerializedMeshData();
        data.vertices = mesh.vertices;
        data.triangles = mesh.triangles;
        data.uv = mesh.uv;
        data.normals = mesh.normals;
        // 复制其他需要的Mesh属性

        return data;
    }

    // 从序列化数据还原为Mesh
    public Mesh ToMesh()
    {
        var mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uv;
        mesh.normals = normals;
        mesh.RecalculateBounds();
        return mesh;
    }
}

2. 修改字典的存储类型

把原来存储Mesh的SerializableDictionary改成存储上面的SerializedMeshData:

// 原代码(无效)
// public SerializableDictionary<string, Mesh> meshDict;

// 修改后
public SerializableDictionary<string, SerializedMeshData> meshDict;

3. 保存与读取的转换逻辑

  • 存档前:将Mesh转换为SerializedMeshData再存入字典
    var targetMesh = GetComponent<MeshFilter>().mesh;
    // 确保Mesh数据已更新到CPU端(避免读取空数据)
    targetMesh.UploadMeshData(false);
    meshDict["playerBody"] = SerializedMeshData.FromMesh(targetMesh);
    // 执行你的存档逻辑
    
  • 读档后:将序列化数据还原为Mesh使用
    if (meshDict.TryGetValue("playerBody", out var serializedData))
    {
        GetComponent<MeshFilter>().mesh = serializedData.ToMesh();
    }
    

关于UpdateGeometryWithMoreVertices的说明

如果提到的UpdateGeometryWithMoreVertices是项目内的自定义方法,它的作用应该是确保Mesh的几何数据已被更新到可读取的状态(类似内置的UploadMeshData)。你只需要在转换Mesh为序列化数据前调用它即可,比如:

targetMesh.UpdateGeometryWithMoreVertices(); // 调用自定义方法
var serializedData = SerializedMeshData.FromMesh(targetMesh);

额外检查

确认你使用的SerializableDictionary本身实现正确:需要标记[Serializable],且支持自定义可序列化类型(如果是第三方实现,确保它能处理SerializedMeshData这类自定义类)。

内容的提问来源于stack exchange,提问作者Mako

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:30:51