Unity:如何通过编辑器脚本移除LOD及对应游戏对象
Unity LODGroup配置及关联对象批量清除实现方案
实现逻辑
- 首先获取选中对象挂载的
LODGroup组件 - 遍历所有LOD配置,收集每个LOD关联的渲染器对应的游戏对象
- 先清空
LODGroup的配置数据,再统一删除收集到的关联游戏对象 - 全程使用Unity内置的Undo接口记录操作,支持撤销还原
完整代码
以下为编辑器脚本,必须放置在项目的Editor文件夹下才能正常运行:
using UnityEditor; using UnityEngine; using System.Linq; public class LODCleaner { [MenuItem("Tools/清除LOD配置及对应对象")] public static void CleanLODAndObjects() { GameObject selectedGo = Selection.activeGameObject; if (selectedGo == null) { EditorUtility.DisplayDialog("提示", "请先选中带LODGroup组件的对象", "确定"); return; } LODGroup lodGroup = selectedGo.GetComponent<LODGroup>(); if (lodGroup == null) { EditorUtility.DisplayDialog("提示", "选中的对象没有LODGroup组件", "确定"); return; } // 收集所有LOD关联的游戏对象 LOD[] lods = lodGroup.GetLODs(); GameObject[] objectsToDelete = new GameObject[lods.Sum(l => l.renderers.Length)]; int validCount = 0; foreach (LOD lod in lods) { foreach (Renderer renderer in lod.renderers) { if (renderer != null) { objectsToDelete[validCount++] = renderer.gameObject; } } } // 记录操作支持撤销 Undo.RecordObject(lodGroup, "清空LOD配置"); // 清空LOD配置 lodGroup.SetLODs(new LOD[0]); lodGroup.RecalculateBounds(); // 删除关联对象 for (int i = 0; i < validCount; i++) { if (objectsToDelete[i] != null) { Undo.DestroyObjectImmediate(objectsToDelete[i]); } } EditorUtility.DisplayDialog("完成", $"已清空LOD配置并删除{validCount}个关联对象", "确定"); } }
使用方法
- 将上述脚本保存到项目
Editor目录下,无该目录可手动创建 - 在Hierarchy面板选中挂载了
LODGroup组件的目标对象 - 点击Unity顶部菜单栏
Tools/清除LOD配置及对应对象即可执行操作
注意事项
- 操作支持撤销,执行后按下
Ctrl+Z(macOS为Command+Z)即可还原所有修改 - 仅删除当前
LODGroup配置中绑定的渲染对象,不会影响未关联的其他子对象 - 若选中对象未挂载
LODGroup组件,脚本会弹出提示终止操作
内容的提问来源于stack exchange,提问作者Bhaskar-kumar-arya
相关产品推荐
相关产品推荐

