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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:08:23