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
相关产品推荐
相关产品推荐

