using UnityEditor; using UnityEditor.AddressableAssets; using UnityEditor.AddressableAssets.Settings; using UnityEngine; using System.IO; using System.Collections.Generic; /// /// 将炮台 Prefab(Turrets/paotai*.prefab)添加到 Addressables, /// 标签:PT + Default(与 Sprite 一致)。 /// 菜单:Tools → 炮台 → 配置Prefab AA标签 /// public class TurretPrefabAALabeler : EditorWindow { private const string PREFABS_DIR = "Assets/MyGame/aa/Game/Turrets"; private const string GROUP_NAME = "Default Local Group"; private const string LABEL_PT = "PT"; private const string LABEL_DEFAULT = "Default"; // ============================ 日志开关 ============================ // 启用: Player Settings → Scripting Define Symbols 添加 ENABLE_EDITOR_LOG // 关闭: 删除该符号。未定义时所有 Log/LogError 调用被编译器自动移除,零开销 [System.Diagnostics.Conditional("ENABLE_EDITOR_LOG")] private static void Log(string msg) { Debug.Log(msg); } [System.Diagnostics.Conditional("ENABLE_EDITOR_LOG")] private static void LogError(string msg) { Debug.LogError(msg); } [MenuItem("Tools/炮台/配置Prefab AA标签(PT+Default)", false, 102)] public static void SetupAddressableLabels() { var settings = AddressableAssetSettingsDefaultObject.Settings; if (settings == null) { EditorUtility.DisplayDialog("错误", "Addressables 未初始化。", "确定"); return; } AddressableAssetGroup defaultGroup = settings.FindGroup(GROUP_NAME) ?? settings.DefaultGroup; if (defaultGroup == null) { EditorUtility.DisplayDialog("错误", $"找不到 Group: {GROUP_NAME}", "确定"); return; } EnsureLabel(settings, LABEL_PT); EnsureLabel(settings, LABEL_DEFAULT); string absoluteDir = Path.Combine(Application.dataPath, "MyGame/aa/Game/Turrets"); string[] prefabFiles = Directory.GetFiles(absoluteDir, "paotai*.prefab"); Log($"[TurretPrefabAA] 扫描到 {prefabFiles.Length} 个炮台 Prefab"); AssetDatabase.Refresh(); int count = 0; var errors = new List(); foreach (string absolutePath in prefabFiles) { string fileName = Path.GetFileNameWithoutExtension(absolutePath); string assetPath = absolutePath.Replace(Application.dataPath, "Assets").Replace("\\", "/"); string guid = AssetDatabase.AssetPathToGUID(assetPath); if (string.IsNullOrEmpty(guid)) { errors.Add($"{fileName}: GUID 为空"); continue; } var entry = settings.FindAssetEntry(guid); if (entry == null) entry = settings.CreateOrMoveEntry(guid, defaultGroup); if (entry == null) { errors.Add($"{fileName}: 无法创建 AA 条目"); continue; } entry.address = fileName; // paotai11001 entry.SetLabel(LABEL_PT, true, true); entry.SetLabel(LABEL_DEFAULT, true, true); count++; Log($"[TurretPrefabAA] ✓ {fileName}"); } settings.SetDirty(AddressableAssetSettings.ModificationEvent.EntryMoved, null, true); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); string msg = $"成功: {count} 个"; if (errors.Count > 0) msg += $"\n\n失败 {errors.Count} 个:\n" + string.Join("\n", errors); EditorUtility.DisplayDialog("Prefab AA标签完成", msg, "确定"); } private static void EnsureLabel(AddressableAssetSettings settings, string label) { if (!settings.GetLabels().Contains(label)) { settings.AddLabel(label); Log($"[TurretPrefabAA] 新增标签: {label}"); } } }