feat: 스킬-패턴 자동 동기화 추가
- Data_Pattern_{name}가 Data_Skill_{name}_{seq}를 순번대로 찾아 시퀀스 스텝을 자동 재구성하도록 추가
- SkillData asset 변경 시 BossPatternData를 다시 맞추는 에디터 postprocessor를 추가
- 드로그 리빌드 경로와 콤보-기본기1 패턴 자산을 새 자동 동기화 규칙에 맞게 정리
This commit is contained in:
101
Assets/_Game/Scripts/Editor/SkillPatternDataMatcher.cs
Normal file
101
Assets/_Game/Scripts/Editor/SkillPatternDataMatcher.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user