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

