Files
Colosseum/Assets/_Game/Scripts/Editor/SkillPatternDataMatcher.cs
dal4segno 72aae85afd feat: 스킬-패턴 자동 동기화 추가
- Data_Pattern_{name}가 Data_Skill_{name}_{seq}를 순번대로 찾아 시퀀스 스텝을 자동 재구성하도록 추가
- SkillData asset 변경 시 BossPatternData를 다시 맞추는 에디터 postprocessor를 추가
- 드로그 리빌드 경로와 콤보-기본기1 패턴 자산을 새 자동 동기화 규칙에 맞게 정리
2026-04-10 11:37:20 +09:00

102 lines
3.4 KiB
C#

using System;
using UnityEditor;
using Colosseum.AI;
namespace Colosseum.Editor
{
/// <summary>
/// SkillData 자산이 변경되면 이름 규칙에 맞는 BossPatternData 스텝 구성을 자동 갱신합니다.
/// </summary>
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();
}
/// <summary>
/// 에디터가 다시 로드될 때 기존 패턴과 스킬 자산 정합성을 한 번 점검합니다.
/// </summary>
[InitializeOnLoadMethod]
private static void RefreshPatternsOnEditorLoad()
{
EditorApplication.delayCall += RefreshAllPatternSteps;
}
/// <summary>
/// 모든 BossPatternData를 순회하며 시퀀스 스킬 스텝을 갱신합니다.
/// </summary>
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<BossPatternData>(path);
if (pattern == null)
continue;
if (pattern.RefreshPatternStepsFromMatchingSkills())
refreshedCount++;
}
if (refreshedCount > 0)
AssetDatabase.SaveAssets();
}
/// <summary>
/// SkillData 관련 자산이 추가/삭제/이동되었는지 확인합니다.
/// </summary>
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;
}
/// <summary>
/// 지정한 경로가 SkillData 자동 매칭 대상 폴더인지 확인합니다.
/// </summary>
private static bool IsSkillAssetPath(string assetPath)
{
return assetPath != null
&& assetPath.StartsWith(SkillsFolderPath, StringComparison.Ordinal)
&& assetPath.EndsWith(".asset", StringComparison.OrdinalIgnoreCase);
}
}
}