- Data_Pattern_{name}가 Data_Skill_{name}_{seq}를 순번대로 찾아 시퀀스 스텝을 자동 재구성하도록 추가
- SkillData asset 변경 시 BossPatternData를 다시 맞추는 에디터 postprocessor를 추가
- 드로그 리빌드 경로와 콤보-기본기1 패턴 자산을 새 자동 동기화 규칙에 맞게 정리
102 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|