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();
}
}
}
}