using System; using UnityEditor; using Colosseum.Skills; namespace Colosseum.Editor { /// /// Animations 폴더 내 애니메이션 클립이 변경(생성/수정/삭제/이동)되면 /// 관련 SkillData의 애니메이션 클립 목록을 자동 갱신합니다. /// public class AnimationClipSkillDataMatcher : AssetPostprocessor { private const string AnimationsFolderPath = "Assets/_Game/Animations"; private static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { bool hasAnimationChange = false; for (int i = 0; i < importedAssets.Length; i++) { if (IsAnimationClipPath(importedAssets[i])) { hasAnimationChange = true; break; } } if (!hasAnimationChange) { for (int i = 0; i < deletedAssets.Length; i++) { if (IsAnimationClipPath(deletedAssets[i])) { hasAnimationChange = true; break; } } } if (!hasAnimationChange) { for (int i = 0; i < movedAssets.Length; i++) { if (IsAnimationClipPath(movedAssets[i]) || IsAnimationClipPath(movedFromAssetPaths[i])) { hasAnimationChange = true; break; } } } if (!hasAnimationChange) return; RefreshAllSkillDataClips(); } /// /// 지정한 경로가 Animations 폴더 내의 애니메이션 클립인지 확인합니다. /// private static bool IsAnimationClipPath(string assetPath) { return assetPath != null && assetPath.StartsWith(AnimationsFolderPath) && assetPath.EndsWith(".anim", StringComparison.OrdinalIgnoreCase); } /// /// 모든 SkillData의 애니메이션 클립 목록을 갱신합니다. /// private static void RefreshAllSkillDataClips() { string[] skillGuids = AssetDatabase.FindAssets("t:SkillData"); int refreshedCount = 0; for (int i = 0; i < skillGuids.Length; i++) { string path = AssetDatabase.GUIDToAssetPath(skillGuids[i]); SkillData skillData = AssetDatabase.LoadAssetAtPath(path); if (skillData == null) continue; int clipCountBefore = skillData.AnimationClips.Count; skillData.RefreshAnimationClips(); if (skillData.AnimationClips.Count != clipCountBefore) refreshedCount++; } if (refreshedCount > 0) { AssetDatabase.SaveAssets(); } } } }