using System; using UnityEditor; using Colosseum.AI; namespace Colosseum.Editor { /// /// SkillData 자산이 변경되면 이름 규칙에 맞는 BossPatternData 스텝 구성을 자동 갱신합니다. /// public class SkillPatternDataMatcher : AssetPostprocessor { private const string SkillsFolderPath = "Assets/_Game/Data/Skills"; private const string PatternsFolderPath = "Assets/_Game/Data/Patterns"; private static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { if (!HasSkillAssetChange(importedAssets, deletedAssets, movedAssets, movedFromAssetPaths)) return; RefreshAllPatternSteps(); } /// /// 에디터가 다시 로드될 때 기존 패턴과 스킬 자산 정합성을 한 번 점검합니다. /// [InitializeOnLoadMethod] private static void RefreshPatternsOnEditorLoad() { EditorApplication.delayCall += RefreshAllPatternSteps; } /// /// 모든 BossPatternData를 순회하며 시퀀스 스킬 스텝을 갱신합니다. /// public static void RefreshAllPatternSteps() { string[] patternGuids = AssetDatabase.FindAssets("t:BossPatternData", new[] { PatternsFolderPath }); int refreshedCount = 0; for (int i = 0; i < patternGuids.Length; i++) { string path = AssetDatabase.GUIDToAssetPath(patternGuids[i]); BossPatternData pattern = AssetDatabase.LoadAssetAtPath(path); if (pattern == null) continue; if (pattern.RefreshPatternStepsFromMatchingSkills()) refreshedCount++; } if (refreshedCount > 0) AssetDatabase.SaveAssets(); } /// /// SkillData 관련 자산이 추가/삭제/이동되었는지 확인합니다. /// private static bool HasSkillAssetChange( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { for (int i = 0; i < importedAssets.Length; i++) { if (IsSkillAssetPath(importedAssets[i])) return true; } for (int i = 0; i < deletedAssets.Length; i++) { if (IsSkillAssetPath(deletedAssets[i])) return true; } for (int i = 0; i < movedAssets.Length; i++) { if (IsSkillAssetPath(movedAssets[i]) || IsSkillAssetPath(movedFromAssetPaths[i])) return true; } return false; } /// /// 지정한 경로가 SkillData 자동 매칭 대상 폴더인지 확인합니다. /// private static bool IsSkillAssetPath(string assetPath) { return assetPath != null && assetPath.StartsWith(SkillsFolderPath, StringComparison.Ordinal) && assetPath.EndsWith(".asset", StringComparison.OrdinalIgnoreCase); } } }