Unity 2021中GraphicsBuffer.GetData无法填充数组问题排查
Unity 2021不可读Mesh转可读Mesh失效问题
背景
我正在为Unity 2021编写代码,实现将不可读Mesh转换为可读Mesh,但目前的函数仅在部分场景生效,部分游戏内Mesh无法正常转换。以下是完整的实现函数:
public static Mesh GetReadable(this Mesh mesh) { if (mesh.isReadable) return Object.Instantiate(mesh); var nMesh = new Mesh(); nMesh.indexFormat = mesh.indexFormat; // vertices nMesh.SetVertexBufferParams(mesh.vertexCount, mesh.GetVertexAttributes()); var buffers = mesh.vertexBufferCount; for (int i = 0; i < buffers; i++) using (var vBuffer = mesh.GetVertexBuffer(i)) { var vData = new byte[vBuffer.stride * vBuffer.count]; vBuffer.GetData(vData); nMesh.SetVertexBufferData(vData, 0, 0, vData.Length, i); } // triangles nMesh.subMeshCount = mesh.subMeshCount; using (var iBuffer = mesh.GetIndexBuffer()) { nMesh.SetIndexBufferParams(iBuffer.count, mesh.indexFormat); var iSize = iBuffer.stride * iBuffer.count; var iData = new byte[iSize]; iBuffer.GetData(iData); nMesh.SetIndexBufferData(iData, 0, 0, iSize); } // submeshes var pos = 0u; for (int i = 0; i < nMesh.subMeshCount; i++) { var subMeshIndexCount = mesh.GetIndexCount(i); nMesh.SetSubMesh(i, new SubMeshDescriptor((int)pos, (int)subMeshIndexCount)); pos += subMeshIndexCount; } nMesh.RecalculateBounds(); return nMesh; }
问题
对特定Mesh使用该函数时,生成的Mesh体积为0。调试发现GraphicsBuffer.GetData并未填充目标数组(预先将数组元素设为1,执行后仍为1),顶点缓冲区和索引缓冲区都存在这个问题。
我尝试在自建Unity项目中复现问题Mesh但失败,暂时不清楚这类Mesh的生成原因。
注:无法直接开启Mesh的isReadable属性,因为我正在对已打包的游戏做模组开发,无法重新构建资源包。
编辑1:排查发现实例化原Mesh也无效——原Mesh挂载到MeshFilter可见,但实例化后的Mesh挂载后不可见。
编辑2:查资料得知,缓冲区未写入数据是因为缓冲区目标未包含Raw标记,但添加该标记后,顶点缓冲区仍无数据,索引缓冲区变为空并抛出空引用错误。
内容的提问来源于stack exchange,提问作者Aidan Reid
相关产品推荐
相关产品推荐

