HKMBFZ/Assets/SKFramework/Editor/LOD/DeleteLOD.cs

80 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace SK.Framework
{
/// <summary>
/// 批量删除场景中的LOD Group组件
/// 删除后只保留最高层次细节的物体
/// </summary>
public class DeleteLOD
{
[MenuItem("SKFramework/LOD/Delete")]
public static void Execute()
{
//弹出进行删除操作的提醒窗口
bool confirm = EditorUtility.DisplayDialog("提醒", "是否确定删除当前场景中所有的LOD Group组件只保留最高层次的细节", "确定", "取消");
//点击取消则return
if (!confirm) return;
//弹出窗口 询问是否执行Prefab Unpack操作
bool unpackPrefab = EditorUtility.DisplayDialog("确认", "如果目标物体属于Prefab预制体执行Prefab Unpack操作还是跳过它", "Unpack", "Skip");
//获取当前场景中的所有根物体
GameObject[] rootObjs = SceneManager.GetActiveScene().GetRootGameObjects();
//遍历所有根物体
for (int i = 0; i < rootObjs.Length; i++)
{
GameObject rootObj = rootObjs[i];
//在根物体及子物体身上查找所有LOD Group组件
LODGroup[] groups = rootObj.GetComponentsInChildren<LODGroup>(true);
//遍历所有LOD Group组件
for (int j = 0; j < groups.Length; j++)
{
LODGroup group = groups[j];
GameObject obj = group.gameObject;
//获取LOD Group中的所有LOD结构
LOD[] lods = group.GetLODs();
if (lods.Length < 2) continue;
//遍历LOD结构 索引从1开始 保留最高层次的细节
for (int l = 1; l < lods.Length; l++)
{
LOD lod = lods[l];
//遍历LOD中的Renderer组件
for (int n = 0; n < lod.renderers.Length; n++)
{
Renderer renderer = lod.renderers[n];
if (renderer == null) continue;
//如果Renderer组件不为空 获取其挂载的物体
GameObject target = renderer.gameObject;
//物体不为空,进行销毁
if (target != null)
{
//如果目标物体属于Prefab预制体
if (PrefabUtility.IsPartOfAnyPrefab(target))
{
if (unpackPrefab)
{
//获取Prefab预制体根级
var prefabRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(target);
//Prefab Unpack Completely
PrefabUtility.UnpackPrefabInstance(prefabRoot, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);
}
else continue;
}
//弹出进度条
EditorUtility.DisplayProgressBar("LOD deleting...", $"{rootObj.name}/{obj.name}/{target.name}", (i + 1) / rootObjs.Length);
Object.DestroyImmediate(target);
}
}
}
Debug.Log($"删除{group.name}的LOD Group组件.");
//销毁LOD Group组件
Object.DestroyImmediate(group);
EditorUtility.SetDirty(obj);
}
}
//清除进度条
EditorUtility.ClearProgressBar();
}
}
}