feat: 방어 시스템과 드로그 검증 경로 정리

- 애니메이션 이벤트 기반 방어/유지/해제 흐름과 HUD 피드백, 방어 디버그 로그를 추가했다.
- 드로그 기본기1 테스트 패턴을 정리하고 공격 판정을 OnEffect 기반으로 옮기며 드로그 범위 효과의 타겟 레이어를 정상화했다.
- 플레이어 퀵슬롯 테스트 세팅과 적-플레이어 겹침 방지 로직을 조정해 충돌 시 적이 수평 이동을 멈추고 최소 분리만 수행하게 했다.
This commit is contained in:
2026-04-07 21:28:52 +09:00
parent 147e9baa25
commit 0c9967d131
72 changed files with 231096 additions and 698 deletions

View File

@@ -397,18 +397,18 @@ namespace Colosseum.Skills
}
/// <summary>
/// 기반 스킬의 채널링 틱 효과를 수집합니다.
/// 기반 스킬의 반복 유지 틱 효과를 수집합니다.
/// </summary>
public void CollectChannelTickEffects(List<SkillEffect> destination)
public void CollectLoopTickEffects(List<SkillEffect> destination)
{
if (destination == null)
return;
if (baseSkill != null && baseSkill.ChannelTickEffects != null)
if (baseSkill != null && baseSkill.LoopTickEffects != null)
{
for (int i = 0; i < baseSkill.ChannelTickEffects.Count; i++)
for (int i = 0; i < baseSkill.LoopTickEffects.Count; i++)
{
SkillEffect effect = baseSkill.ChannelTickEffects[i];
SkillEffect effect = baseSkill.LoopTickEffects[i];
if (effect != null)
destination.Add(effect);
}
@@ -426,18 +426,18 @@ namespace Colosseum.Skills
}
/// <summary>
/// 기반 스킬의 채널링 종료 효과를 수집합니다.
/// 기반 스킬의 반복 유지 종료 효과를 수집합니다.
/// </summary>
public void CollectChannelEndEffects(List<SkillEffect> destination)
public void CollectLoopExitEffects(List<SkillEffect> destination)
{
if (destination == null)
return;
if (baseSkill != null && baseSkill.ChannelEndEffects != null)
if (baseSkill != null && baseSkill.LoopExitEffects != null)
{
for (int i = 0; i < baseSkill.ChannelEndEffects.Count; i++)
for (int i = 0; i < baseSkill.LoopExitEffects.Count; i++)
{
SkillEffect effect = baseSkill.ChannelEndEffects[i];
SkillEffect effect = baseSkill.LoopExitEffects[i];
if (effect != null)
destination.Add(effect);
}
@@ -454,6 +454,51 @@ namespace Colosseum.Skills
}
}
/// <summary>
/// 기반 스킬의 해제 단계 시작 효과를 수집합니다.
/// </summary>
public void CollectReleaseStartEffects(List<SkillEffect> destination)
{
if (destination == null)
return;
if (baseSkill != null && baseSkill.ReleaseStartEffects != null)
{
for (int i = 0; i < baseSkill.ReleaseStartEffects.Count; i++)
{
SkillEffect effect = baseSkill.ReleaseStartEffects[i];
if (effect != null)
destination.Add(effect);
}
}
if (socketedGems == null)
return;
for (int i = 0; i < socketedGems.Length; i++)
{
SkillGemData gem = socketedGems[i];
if (gem == null)
continue;
}
}
/// <summary>
/// 레거시 채널링 틱 효과 수집 호환 경로입니다.
/// </summary>
public void CollectChannelTickEffects(List<SkillEffect> destination)
{
CollectLoopTickEffects(destination);
}
/// <summary>
/// 레거시 채널링 종료 효과 수집 호환 경로입니다.
/// </summary>
public void CollectChannelEndEffects(List<SkillEffect> destination)
{
CollectLoopExitEffects(destination);
}
private static void AddTriggeredEffect(Dictionary<int, List<SkillEffect>> destination, int triggerIndex, SkillEffect effect)
{
if (!destination.TryGetValue(triggerIndex, out List<SkillEffect> effectList))