feat: 회피 상태와 스킬 시작 판정 분리
- CanEvade를 제거하고 IsEvading 상태와 CanStartSkill 판정으로 정리 - 침묵 중 회피 상태 유지와 회피 스킬 차단 규칙을 반영 - 자동 검증 러너와 디버그 HUD에 회피 상호작용 검증을 추가
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
|
||||
using UnityEngine;
|
||||
@@ -5,6 +6,7 @@ using UnityEngine;
|
||||
using Unity.Netcode;
|
||||
|
||||
using Colosseum.Abnormalities;
|
||||
using Colosseum.Skills;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
@@ -23,6 +25,8 @@ namespace Colosseum.Player
|
||||
[SerializeField] private AbnormalityManager abnormalityManager;
|
||||
[SerializeField] private PlayerActionState actionState;
|
||||
[SerializeField] private PlayerNetworkController networkController;
|
||||
[SerializeField] private PlayerSkillInput skillInput;
|
||||
[SerializeField] private SkillController skillController;
|
||||
|
||||
[Header("Test Data")]
|
||||
[SerializeField] private AbnormalityData stunData;
|
||||
@@ -100,6 +104,9 @@ namespace Colosseum.Player
|
||||
Verify("초기 상태: 사망 아님", !networkController.IsDead);
|
||||
Verify("초기 상태: 이동 가능", actionState.CanMove);
|
||||
Verify("초기 상태: 스킬 사용 가능", actionState.CanUseSkills);
|
||||
Verify("초기 상태: 회피 상태 아님", !actionState.IsEvading);
|
||||
|
||||
yield return RunEvadeVerification();
|
||||
|
||||
abnormalityManager.ApplyAbnormality(stunData, gameObject);
|
||||
yield return new WaitForSeconds(settleDelay);
|
||||
@@ -176,6 +183,10 @@ namespace Colosseum.Player
|
||||
actionState = GetComponent<PlayerActionState>();
|
||||
if (networkController == null)
|
||||
networkController = GetComponent<PlayerNetworkController>();
|
||||
if (skillInput == null)
|
||||
skillInput = GetComponent<PlayerSkillInput>();
|
||||
if (skillController == null)
|
||||
skillController = GetComponent<SkillController>();
|
||||
}
|
||||
|
||||
private void LoadDefaultAssetsIfNeeded()
|
||||
@@ -222,5 +233,70 @@ namespace Colosseum.Player
|
||||
return Debug.isDebugBuild;
|
||||
#endif
|
||||
}
|
||||
|
||||
private IEnumerator RunEvadeVerification()
|
||||
{
|
||||
SkillData evadeSkill = skillInput != null ? skillInput.GetSkill(6) : null;
|
||||
if (evadeSkill == null)
|
||||
{
|
||||
AppendLine("[SKIP] 회피 검증: 회피 슬롯 스킬이 없습니다.");
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (skillController == null || !skillController.ExecuteSkill(evadeSkill))
|
||||
{
|
||||
Verify("회피 검증: 스킬 실행 성공", false);
|
||||
yield break;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(settleDelay);
|
||||
|
||||
Verify("회피 적용: IsEvading", actionState.IsEvading);
|
||||
Verify("회피 적용: 이동 불가", !actionState.CanMove);
|
||||
Verify("회피 적용: 점프 불가", !actionState.CanJump);
|
||||
Verify("회피 적용: 일반 스킬 사용 불가", !actionState.CanUseSkills);
|
||||
Verify("회피 적용: 회피 스킬 연속 사용 불가", !actionState.CanStartSkill(evadeSkill));
|
||||
|
||||
if (silenceData != null)
|
||||
{
|
||||
abnormalityManager.ApplyAbnormality(silenceData, gameObject);
|
||||
yield return WaitForConditionOrTimeout(() => actionState.IsSilenced, settleDelay + 0.5f);
|
||||
|
||||
Verify("회피 중 침묵 적용: IsSilenced", actionState.IsSilenced);
|
||||
Verify("회피 중 침묵 적용: 회피 상태 유지", actionState.IsEvading);
|
||||
Verify("회피 중 침묵 적용: 회피 스킬 신규 사용 불가", !actionState.CanStartSkill(evadeSkill));
|
||||
|
||||
abnormalityManager.RemoveAbnormality(silenceData);
|
||||
yield return new WaitForSeconds(settleDelay);
|
||||
}
|
||||
|
||||
yield return WaitForConditionOrTimeout(() => !actionState.IsEvading, GetSkillDuration(evadeSkill) + 1.5f);
|
||||
|
||||
Verify("회피 해제: IsEvading false", !actionState.IsEvading);
|
||||
Verify("회피 해제: 이동 가능 복구", actionState.CanMove);
|
||||
Verify("회피 해제: 스킬 사용 가능 복구", actionState.CanUseSkills);
|
||||
Verify("회피 해제: 회피 스킬 재사용 가능 복구", actionState.CanStartSkill(evadeSkill));
|
||||
}
|
||||
|
||||
private float GetSkillDuration(SkillData skill)
|
||||
{
|
||||
if (skill == null || skill.SkillClip == null)
|
||||
return settleDelay;
|
||||
|
||||
return Mathf.Max(settleDelay, skill.SkillClip.length / Mathf.Max(0.1f, skill.AnimationSpeed));
|
||||
}
|
||||
|
||||
private IEnumerator WaitForConditionOrTimeout(Func<bool> predicate, float timeout)
|
||||
{
|
||||
float elapsed = 0f;
|
||||
while (elapsed < timeout)
|
||||
{
|
||||
if (predicate())
|
||||
yield break;
|
||||
|
||||
elapsed += Time.deltaTime;
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user