using UnityEngine; using UnityEditor; using System.Collections.Generic; /// /// 场景Elements Y-Sort添加工具 /// public class SceneElementsYSorter : Editor { [MenuItem("Tools/Y-Sort/给Test场景Elements添加YSorter")] public static void AddYSorterToTestSceneElements() { // 查找场景中的Elements物体 GameObject elements = GameObject.Find("Elements"); if (elements == null) { EditorUtility.DisplayDialog("错误", "找不到场景中的 'Elements' 物体", "确定"); return; } Transform elementsTransform = elements.transform; int count = 0; List processedObjects = new List(); // 遍历所有直接子物体 for (int i = 0; i < elementsTransform.childCount; i++) { Transform child = elementsTransform.GetChild(i); // 检查是否已有YSorter if (child.GetComponent() != null) { Debug.Log($"跳过 {child.name} - 已有YSorter"); continue; } // 添加YSorter组件 YSorter ySorter = child.gameObject.AddComponent(); // 根据物体名称设置baseSortingOrder int baseOrder = DetermineBaseOrder(child.name); // 通过SerializedObject设置 SerializedObject so = new SerializedObject(ySorter); SerializedProperty prop = so.FindProperty("baseSortingOrder"); if (prop != null) { prop.intValue = baseOrder; so.ApplyModifiedProperties(); } // 标记场景已修改 EditorUtility.SetDirty(child.gameObject); count++; processedObjects.Add($"{child.name} (baseSortingOrder: {baseOrder})"); Debug.Log($"✓ 已添加 YSorter 到 {child.name} (baseSortingOrder: {baseOrder})"); } // 保存场景 if (count > 0) { UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ); EditorUtility.DisplayDialog( "完成", $"已给 {count} 个物体添加YSorter\n\n" + string.Join("\n", processedObjects), "确定" ); } else { EditorUtility.DisplayDialog("提示", "所有物体都已有YSorter", "确定"); } } [MenuItem("Tools/Y-Sort/给选中物体添加YSorter")] public static void AddYSorterToSelected() { if (Selection.gameObjects.Length == 0) { EditorUtility.DisplayDialog("提示", "请先选择物体", "确定"); return; } int count = 0; foreach (GameObject go in Selection.gameObjects) { if (go.GetComponent() != null) { Debug.Log($"跳过 {go.name} - 已有YSorter"); continue; } YSorter ySorter = go.AddComponent(); int baseOrder = DetermineBaseOrder(go.name); SerializedObject so = new SerializedObject(ySorter); SerializedProperty prop = so.FindProperty("baseSortingOrder"); if (prop != null) { prop.intValue = baseOrder; so.ApplyModifiedProperties(); } EditorUtility.SetDirty(go); count++; Debug.Log($"✓ 已添加 YSorter 到 {go.name} (baseSortingOrder: {baseOrder})"); } if (count > 0) { UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty( UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene() ); Debug.Log($"完成!给 {count} 个物体添加了YSorter"); } } private static int DetermineBaseOrder(string objectName) { string nameLower = objectName.ToLower(); if (nameLower.Contains("ground") || nameLower.Contains("floor")) return 0; if (nameLower.Contains("shadow")) return 500; if (nameLower.Contains("grass") || nameLower.Contains("flower") || nameLower.Contains("leaf") || nameLower.Contains("leaves")) return 800; if (nameLower.Contains("rock") || nameLower.Contains("bamboo") || nameLower.Contains("barrel") || nameLower.Contains("box") || nameLower.Contains("log") || nameLower.Contains("board") || nameLower.Contains("bush") || nameLower.Contains("bonfire") || nameLower.Contains("candle") || nameLower.Contains("carcasses") || nameLower.Contains("lotus") || nameLower.Contains("pedestal") || nameLower.Contains("scarecrow") || nameLower.Contains("skeleton") || nameLower.Contains("skull") || nameLower.Contains("spear") || nameLower.Contains("statue") || nameLower.Contains("tent") || nameLower.Contains("tenticles") || nameLower.Contains("wooden") || nameLower.Contains("bag") || nameLower.Contains("house")) return 1000; return 1000; } }