You need to enable JavaScript to run this app. Unity获取GameObject子物体Mesh时出现Mesh转MeshFilter错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Unity获取GameObject子物体Mesh时出现Mesh转MeshFilter错误如何解决

报错原因

你写的代码中,gameObject.GetComponentInChildren<MeshFilter>().sharedMesh 取到的已经是UnityEngine.Mesh类型的资源,你强行将其转为MeshFilter类型,触发了类型不匹配报错。

快速修复方案

调整取值逻辑,先取MeshFilter组件,再从组件中获取Mesh即可:

// 先获取子物体上的MeshFilter组件
MeshFilter viewedModelFilter = gameObject.GetComponentInChildren<MeshFilter>();
// 再从组件中获取Mesh赋值,不需要修改Mesh就用sharedMesh减少性能开销
buildingPreviewMesh = viewedModelFilter.sharedMesh;

更优实现方案

建议增加空值校验、多Mesh场景兼容逻辑,避免空引用报错:

单Mesh场景(仅一个子物体带Mesh)

MeshFilter[] childMeshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
if(childMeshFilters.Length > 0)
{
    buildingPreviewMesh = childMeshFilters[0].sharedMesh;
}
else
{
    Debug.LogWarning("当前父物体下未找到任何带MeshFilter的子物体");
}

多Mesh合并场景(多个子物体带Mesh,需合并为一个预览Mesh)

如果子物体有多个独立Mesh,需要整合成单个预览Mesh可以用合并逻辑:

MeshFilter[] childMeshFilters = gameObject.GetComponentsInChildren<MeshFilter>();
List<CombineInstance> combines = new List<CombineInstance>();

foreach(var filter in childMeshFilters)
{
    CombineInstance combine = new CombineInstance();
    combine.mesh = filter.sharedMesh;
    // 保留子物体相对父物体的坐标偏移
    combine.transform = filter.transform.localToWorldMatrix;
    combines.Add(combine);
}

if(combines.Count > 0)
{
    buildingPreviewMesh = new Mesh();
    buildingPreviewMesh.CombineMeshes(combines.ToArray());
}
else
{
    Debug.LogWarning("当前父物体下未找到任何带MeshFilter的子物体");
}

小提示:如果只是读取Mesh做预览展示,优先用sharedMesh,直接读取原Mesh资源不会产生额外副本;如果需要运行时修改获取到的Mesh,再用mesh属性,Unity会自动生成一个原Mesh的副本供你修改,不会影响原资源。

内容的提问来源于stack exchange,提问作者Daito Y.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 22:27:03