refactor: 스킬 트리거 효과를 그룹 구조로 변경 — 하나의 애니메이션 이벤트로 여러 effect 발동 가능

- SkillGemTriggeredEffectEntry를 공용 타입 SkillTriggeredEffectEntry로 승격

- SkillData.effects를 List<SkillTriggeredEffectEntry>로 변경 (기존 flat list는 OnValidate에서 자동 마이그레이션)

- SkillLoadoutEntry, PlayerSkillInput 등 소비자 코드 그룹 구조 대응

- 기존 스킬 에셋 마이그레이션 완료

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-03 08:26:08 +09:00
parent ee8f4a5701
commit 40e3252901
70 changed files with 1373 additions and 36 deletions

View File

@@ -67,9 +67,35 @@ namespace Colosseum.Skills
/// </summary>
private void OnValidate()
{
MigrateLegacyEffects();
RefreshAnimationClips();
}
/// <summary>
/// 레거시 flat effects 리스트를 grouped triggeredEffects 구조로 마이그레이션합니다.
/// </summary>
private void MigrateLegacyEffects()
{
if (effects == null || effects.Count == 0)
return;
if (triggeredEffects != null && triggeredEffects.Count > 0)
return;
triggeredEffects = new List<SkillTriggeredEffectEntry>();
for (int i = 0; i < effects.Count; i++)
{
SkillEffect effect = effects[i];
if (effect == null)
continue;
triggeredEffects.Add(new SkillTriggeredEffectEntry(i, new List<SkillEffect> { effect }));
}
effects.Clear();
UnityEditor.EditorUtility.SetDirty(this);
Debug.Log($"[SkillData] '{name}' effects 마이그레이션 완료: {triggeredEffects.Count}개 엔트리", this);
}
/// <summary>
/// 애셋 이름 기반으로 매칭되는 애니메이션 클립을 자동 수집합니다.
/// SkillData 이름이 'Data_Skill_'으로 시작하면 'Anim_{key}_{순서}' 클립을 찾아 animationClips에 채웁니다.
@@ -192,13 +218,18 @@ namespace Colosseum.Skills
[Tooltip("이 스킬에 장착 가능한 젬 슬롯 수")]
[Min(0)] [SerializeField] private int maxGemSlotCount = 2;
[Header("효과 목록")]
[Header("시전 시작 효과")]
[Tooltip("시전 시작 즉시 발동하는 효과 목록. 시전 보호 버프 등에 사용됩니다.")]
[SerializeField] private List<SkillEffect> castStartEffects = new List<SkillEffect>();
[Header("효과 목록")]
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 리스트 순서 = 이벤트 인덱스")]
[SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
[Header("트리거 효과 목록")]
[Tooltip("애니메이션 이벤트 OnEffect(index)로 발동. 각 엔트리의 Trigger Index가 이벤트 인덱스와 매칭됩니다.")]
[SerializeField] private List<SkillTriggeredEffectEntry> triggeredEffects = new();
/// <summary>
/// 레거시 flat effects 리스트. OnValidate에서 triggeredEffects로 자동 마이그레이션됩니다.
/// </summary>
[HideInInspector] [SerializeField] private List<SkillEffect> effects = new List<SkillEffect>();
// Properties
public string SkillName => skillName;
@@ -227,7 +258,7 @@ namespace Colosseum.Skills
public bool BlockJumpWhileCasting => blockJumpWhileCasting;
public bool BlockOtherSkillsWhileCasting => blockOtherSkillsWhileCasting;
public IReadOnlyList<SkillEffect> CastStartEffects => castStartEffects;
public IReadOnlyList<SkillEffect> Effects => effects;
public IReadOnlyList<SkillTriggeredEffectEntry> TriggeredEffects => triggeredEffects;
public WeaponTrait AllowedWeaponTraits => allowedWeaponTraits;
/// <summary>