using UnityEngine; using UnityEditor; using System.IO; /// /// Y-Sort 批量添加工具 /// /// 使用方法: /// 1. 在Unity菜单栏点击 Tools -> Y-Sort -> 批量添加YSorter /// 2. 会自动给Player、Enemy和所有场景预制体添加YSorter组件 /// 3. 根据物体类型自动设置baseSortingOrder /// public class YSortBatchAdder : Editor { [MenuItem("Tools/Y-Sort/批量添加YSorter到所有预制体")] public static void AddYSorterToAllPrefabs() { string prefabFolder = "Assets/2.5D Engine/Prefabs"; if (!Directory.Exists(prefabFolder)) { Debug.LogError($"找不到预制体文件夹: {prefabFolder}"); return; } string[] prefabPaths = Directory.GetFiles(prefabFolder, "*.prefab", SearchOption.AllDirectories); int count = 0; foreach (string path in prefabPaths) { string normalizedPath = path.Replace("\\", "/"); GameObject prefab = AssetDatabase.LoadAssetAtPath(normalizedPath); if (prefab == null) continue; // 检查是否已经有YSorter if (prefab.GetComponentInChildren() != null) { Debug.Log($"跳过 {prefab.name} - 已有YSorter"); continue; } // 根据预制体名称判断类型并设置baseSortingOrder int baseOrder = DetermineBaseOrder(prefab.name); // 添加到根物体 AddYSorterToPrefab(prefab, baseOrder); count++; Debug.Log($"已添加 YSorter 到 {prefab.name} (baseSortingOrder: {baseOrder})"); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log($"完成!共添加了 {count} 个YSorter"); } [MenuItem("Tools/Y-Sort/添加YSorter到Player")] public static void AddYSorterToPlayer() { string playerPath = "Assets/2.5D Engine/Player.prefab"; GameObject player = AssetDatabase.LoadAssetAtPath(playerPath); if (player == null) { Debug.LogError($"找不到Player预制体: {playerPath}"); return; } AddYSorterToPrefab(player, 2000); // 角色层 AssetDatabase.SaveAssets(); Debug.Log("已添加YSorter到Player (baseSortingOrder: 2000)"); } [MenuItem("Tools/Y-Sort/添加YSorter到Enemy")] public static void AddYSorterToEnemy() { string enemyPath = "Assets/2.5D Engine/Enemy.prefab"; GameObject enemy = AssetDatabase.LoadAssetAtPath(enemyPath); if (enemy == null) { Debug.LogError($"找不到Enemy预制体: {enemyPath}"); return; } AddYSorterToPrefab(enemy, 2000); // 角色层 AssetDatabase.SaveAssets(); Debug.Log("已添加YSorter到Enemy (baseSortingOrder: 2000)"); } private static int DetermineBaseOrder(string prefabName) { string nameLower = prefabName.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; } private static void AddYSorterToPrefab(GameObject prefab, int baseSortingOrder) { // 使用PrefabUtility打开预制体进行编辑 string prefabPath = AssetDatabase.GetAssetPath(prefab); GameObject prefabRoot = PrefabUtility.LoadPrefabContents(prefabPath); // 添加YSorter组件到根物体 YSorter ySorter = prefabRoot.AddComponent(); // 通过SerializedObject设置baseSortingOrder SerializedObject so = new SerializedObject(ySorter); SerializedProperty baseOrderProp = so.FindProperty("baseSortingOrder"); if (baseOrderProp != null) { baseOrderProp.intValue = baseSortingOrder; so.ApplyModifiedProperties(); } // 保存预制体 PrefabUtility.SaveAsPrefabAsset(prefabRoot, prefabPath); PrefabUtility.UnloadPrefabContents(prefabRoot); } }