UE5蓝图工具删除静态网格体顶点颜色后修改未保存问题求助
问题:批量删除Static Mesh顶点颜色后修改未保存
尝试制作蓝图工具批量处理Static Mesh的顶点颜色,编写了C++蓝图函数删除顶点颜色,日志显示函数执行成功,但打开顶点颜色编辑器后,Static Mesh仍显示原有顶点颜色数据。函数核心代码如下:
... for (FStaticMeshLODResources& LODResource : RenderData->LODResources) { if (LODResource.bHasColorVertexData) { LODResource.VertexBuffers.ColorVertexBuffer.ReleaseResource(); LODResource.VertexBuffers.ColorVertexBuffer.CleanUp(); LODResource.bHasColorVertexData = false; } } StaticMesh->PostEditChange(); StaticMesh->MarkPackageDirty(); ...
解决方案
问题根源
你修改的是运行时渲染数据(RenderData),但Static Mesh的顶点颜色编辑器读取的是源资产数据(SourceModels中的RawMesh)。RenderData是从源数据实时生成的临时数据,重启编辑器或重新构建Static Mesh后就会被覆盖,且不会保存到资产文件中。
正确实现代码
需要直接修改Static Mesh的源数据,再重新构建资产:
UStaticMesh* StaticMesh = ...; // 你的输入参数 if (!StaticMesh || StaticMesh->SourceModels.Num() == 0) { return; } // 遍历所有LOD的源模型数据 for (FStaticMeshSourceModel& SourceModel : StaticMesh->SourceModels) { if (!SourceModel.RawMesh) { continue; } // 清除所有顶点的颜色数据(设为默认白色,或按需修改) for (FColor& VertexColor : SourceModel.RawMesh->VertexColors) { VertexColor = FColor::White; } } // 重新构建Static Mesh,基于修改后的源数据生成新的RenderData StaticMesh->Build(false); // 触发编辑器更新并标记资产为脏(需要保存) StaticMesh->PostEditChange(); StaticMesh->MarkPackageDirty();
额外注意事项
- 操作前务必备份Static Mesh资产,修改源数据是不可逆的
- 确保Static Mesh资产不是只读状态,否则无法保存修改
- 如果需要彻底移除颜色通道(而不是设为默认色),可以检查RawMesh的顶点格式,移除对应的颜色属性(不过通常设为默认色就能满足编辑器不显示自定义顶点颜色的需求)
内容的提问来源于stack exchange,提问作者Youan
相关产品推荐
相关产品推荐

