Damage Gate 피드백 설계: 보스 페이즈 전환 무적을 공정하게 만드는 방법
보스 페이즈 전환의 무적 시간이 왜 불공정하게 느껴지는지 분석하고 Damage Gate의 임계값, 초과 피해, 텔레그래프, 카메라와 UI를 설계하는 실전 가이드를 정리한다. Unity C# 예제와 QA 체크리스트도 함께 다룬다.

핵심 요약
보스의 페이즈 전환 무적이 불공정하게 느껴지는 핵심 원인은 피해가 막혔다는 사실보다 그 규칙과 종료 시점을 플레이어가 알 수 없다는 데 있다. Damage Gate는 보스 체력을 특정 임계값에서 멈추게 하는 시스템이며 임계값 도달 전 경고, 공격이 연결됐다는 반응, 전환 진행 표시, 전환 종료 신호를 하나의 피드백 계약으로 설계해야 한다.
Damage Gate란 무엇인가?
Damage Gate는 보스 체력이 특정 값 아래로 내려가지 않도록 피해 적용량을 제한하는 전투 시스템이다. 보스의 다음 페이즈를 안정적으로 시작하거나 특정 연출을 보장할 때 사용한다.
핵심 계산은 다음과 같다.
D_mitigated: 방어력, 속성 저항 등을 적용한 최종 피해H_before: 피해 적용 직전 보스 체력H_gate: 페이즈 전환을 위해 설정한 체력 임계값D_applied: 실제 체력에 반영되는 피해
피해가 임계값을 초과하면 초과분은 체력 피해가 아니라 gate absorbed 이벤트로 처리한다.
이 식은 피해 적용 전 체력이 현재 Gate 이상이라는 상태 불변 조건을 전제로 합니다. Gate 아래로 내려가지 않게 하는 제한은 D_applied 계산에서 처리합니다.
중요한 점은 Damage Gate와 일반적인 무적 상태를 같은 것으로 취급하지 않는 것이다.
| 상태 | 피해 처리 | 플레이어가 이해해야 할 의미 |
|---|---|---|
| 일반 전투 | 피해를 체력에 반영 | 공격이 정상적으로 유효함 |
| Damage Gate 접촉 | 임계값까지만 반영하고 초과분 흡수 | 페이즈 전환 조건에 도달함 |
| 전환 무적 | 체력 피해를 적용하지 않음 | 보스가 다음 행동을 준비하는 중임 |
| 전환 종료 | 다시 정상적으로 피해 적용 | 공격 가능한 시간이 돌아옴 |
왜 보스 페이즈 전환 무적은 불공정하게 느껴지는가?
플레이어는 공격 버튼을 눌렀고 타격 이펙트도 봤는데 체력은 줄지 않는 상황을 부당한 손실로 해석하기 쉽다. 특히 다음 조건이 겹치면 무적이 버그처럼 보인다.
- 강한 공격이나 필살기의 피해 숫자는 크게 표시됐지만 실제 체력은 줄지 않음
- 보스의 무적 시작 시점이 공격 애니메이션 중간에 있어 판정 기준을 알기 어려움
- 체력 바가 임계값에 도달한 뒤에도 전환까지 긴 시간이 걸림
- 무적 종료 시점에 별도의 이펙트나 사운드가 없어 언제 다시 공격해야 하는지 알 수 없음
- 다단히트, 지속 피해, 투사체처럼 플레이어가 이미 실행한 공격의 결과가 사라짐
- 네트워크 지연이나 카메라 전환 때문에 보스의 상태 변화가 늦게 보임
따라서 공정성은 무적 시간을 없애는 것만으로 해결되지 않는다. 플레이어가 다음 네 가지를 짧은 시간 안에 판단할 수 있어야 한다.
- 지금 임계값에 접근하고 있는가?
- 방금 공격은 보스에게 닿았는가?
- 현재 피해가 막힌 이유는 무엇인가?
- 언제 다시 공격할 수 있는가?
Damage Gate 피드백은 어떻게 설계해야 하는가?
1. 임계값 전에 전환을 예고한다
체력이 H_gate에 도달한 순간 처음으로 신호를 보내면 반응 시간이 너무 짧을 수 있다. H_warn이라는 사전 경고 지점을 별도로 두고 보스의 자세, 재질 변화, 사운드, 체력 바 마커를 함께 사용한다.
예를 들어 다음과 같이 설정할 수 있다.
H_warn: 전환 임계값보다 약간 높은 체력 지점H_gate: 실제로 체력을 멈추는 지점warnLeadTime: 플레이어가 다음 행동을 예측할 수 있는 최소 시간
초기 튜닝 후보로는 짧은 텔레그래프를 0.3~0.6초 범위에서 테스트할 수 있다. 다만 공격 속도, 카메라 거리, 보스 크기, 게임의 전투 템포에 따라 조정해야 한다.
체력 바에는 단순한 색 변화보다 명확한 구조를 사용하는 편이 좋다.
| 시점 | 체력 바 피드백 | 보스 피드백 |
|---|---|---|
H_warn 진입 | 다음 페이즈 구간에 마커 표시 | 자세 변화와 준비 사운드 |
H_gate 도달 | 체력 바가 임계값에서 고정 | 보호막, 문양, 색상 변화 |
| 전환 진행 중 | 현재 페이즈와 진행 상태 표시 | 카메라와 애니메이션 연출 |
| 전환 종료 | 체력 바의 새 구간 활성화 | 공격 가능 사운드와 약점 표시 |
2. 공격이 연결됐다는 사실과 피해 적용 여부를 분리한다
무적이라고 해서 공격 접촉을 무시하면 안 된다. 플레이어가 수행한 행동에는 최소한의 확인 응답이 필요하다.
- 정상 피해: 일반 히트 이펙트, 피격음, 피해 숫자
- Gate 초과 피해: 보호막 충돌 이펙트, 별도 피격음,
GATE또는PHASE LIMIT표시 - 전환 무적 중 공격: 보호막 반사 이펙트, 일반 피해 숫자 없음
- 전환 종료 직후 공격: 정상 히트 이펙트와 피해 숫자
여기서 가장 중요한 UX 규칙은 실제 적용 피해와 흡수된 피해를 같은 숫자로 표시하지 않는 것이다. D_mitigated 전체를 피해 숫자로 보여주면 보스 체력이 줄지 않은 이유와 화면 정보가 충돌한다.
3. 무적 시작과 종료를 다른 신호로 만든다
무적 시작에는 강한 차단 신호가 필요하지만 종료에는 공격 가능 신호가 필요하다. 같은 이펙트를 반복하면 상태 변화가 잘 구분되지 않는다.
- 시작: 짧고 강한 저음, 보호막 생성, 보스의 공격 중단
- 진행: 페이즈 이름, 문양, 제한된 카메라 연출
- 종료: 보호막 해제, 상승하는 음색, 약점 노출, 피격 반응 복귀
화면 흔들림과 긴 카메라 컷신은 연출을 강화하지만 입력 타이밍을 가릴 수 있다. hitstop, 카메라 줌, 화면 플래시를 동시에 크게 사용하지 말고 전투에 필요한 정보를 우선해야 한다.
4. 전환 중에도 플레이어의 행동 가치를 보존한다
필살기나 긴 쿨다운 공격이 Gate에서 막히면 플레이어는 자원을 잃었다고 느낄 수 있다. 모든 피해를 보상해야 한다는 뜻은 아니지만 시스템의 규칙을 미리 알려야 한다.
가능한 설계 방법은 다음과 같다.
- 보스 체력 바에 페이즈 임계값을 미리 표시한다.
- 임계값에 도달한 공격은 Gate 충돌 효과로 명확히 확인한다.
- 피해 자체는 막더라도 자원 회복, 스태거 게이지, 버프 지속 시간 등 일부 전투 가치를 유지한다.
- 특정 필살기는 페이즈 전환 후에도 유지되도록 예약하거나 전환 연출이 끝난 뒤 이어지게 한다.
- 공격이 사라지는 것이 의도라면 튜토리얼이나 첫 보스에서 그 규칙을 학습시킨다.
Damage Gate를 어떻게 구현할까?
Step 1. 피해 파이프라인에 Gate를 명시한다
피해 계산 순서는 일반적으로 다음처럼 분리하는 것이 안전하다.
Raw Damage → Mitigation → Damage Gate → Health Apply → Feedback Event
Damage Gate를 방어력 계산보다 앞에 두면 실제 보스가 받아야 할 피해와 화면에 표시할 피해를 혼동하기 쉽다. 먼저 최종 피해를 계산한 뒤 체력 적용 단계에서 Gate를 검사한다.
Unity C# 예시는 다음과 같다.
public DamageResult ApplyDamage(DamagePacket packet)
{
float mitigated = Mathf.Max(0f, mitigation.Calculate(packet, stats));
if (phase.State == BossPhaseState.TransitionInvulnerable)
{
feedback.EmitInvulnerableContact(packet.HitPoint);
return new DamageResult(
0f,
mitigated,
DamageOutcome.AbsorbedByPhase
);
}
float remainingToGate = Mathf.Max(
0f,
health - phase.CurrentGateHp
);
float applied = Mathf.Clamp(
mitigated,
0f,
remainingToGate
);
float absorbed = mitigated - applied;
health -= applied;
if (absorbed > 0f)
{
feedback.EmitGateContact(packet.HitPoint, absorbed);
}
if (phase.HasNextPhase && health <= phase.CurrentGateHp + phase.Epsilon)
{
// BeginTransition also emits the threshold-reached cue, even if absorbed is zero.
phase.BeginTransition();
}
return new DamageResult(
applied,
absorbed,
DamageOutcome.AppliedOrGated
);
}
실제 프로젝트에서는 DamageResult에 다음 정보를 포함하면 UI와 전투 로그를 안정적으로 연결할 수 있다.
AppliedDamageAbsorbedDamageDamageOutcomeHitPointPhaseIdGateId
Step 2. 상태 머신과 애니메이션을 분리한다
페이즈 전환의 기준은 애니메이션 이벤트가 아니라 전투 상태 머신이 가져야 한다. 애니메이션은 상태를 표현하고 상태를 결정하지 않는 편이 안전하다.
권장 상태는 다음과 같다.
| 상태 | 입력 처리 | 피해 처리 | 종료 조건 |
|---|---|---|---|
Active | 정상 | Gate 검사 | 체력 또는 별도 조건 |
GateWarning | 정상 또는 제한 | Gate 검사 | 경고 시간 종료 |
TransitionInvulnerable | 패턴 준비 | 전부 흡수 | 전환 타이머와 애니메이션 종료 |
Recovering | 제한적 | 정상 또는 약화 | 복귀 애니메이션 종료 |
ActiveNextPhase | 정상 | 새 Gate 적용 | 다음 전환 조건 |
연출이 늦어지거나 애니메이션 프레임이 변경돼도 상태 머신의 TransitionInvulnerable 시작과 종료는 동일한 게임 규칙을 유지해야 한다.
Step 3. 멀티플레이에서는 서버 권한을 고정한다
멀티플레이 게임이라면 Damage Gate와 페이즈 상태는 서버 권한으로 처리해야 한다. 클라이언트는 PhaseId, GateHp, InvulnerableStart, InvulnerableEnd 같은 상태 정보를 받아서 연출을 재생한다.
클라이언트에서 먼저 피해 숫자를 표시할 경우 서버 판정과 화면이 어긋날 수 있다. 따라서 다음 원칙을 적용한다.
- 서버는 최종 적용 피해와 Gate 흡수 여부를 판정한다.
- 클라이언트는 서버 이벤트를 기준으로 피해 숫자를 표시한다.
- 왕복 지연 중에는 예측 히트 이펙트를 보여줄 수 있지만 실제 피해 숫자는 확정 전 표시하지 않는다.
- 전환 종료 이벤트에는 서버 타임스탬프나 동기화된 종료 시간을 포함한다.
초과 피해와 다단히트는 어떻게 다뤄야 하는가?
한 번의 강한 공격이 임계값을 넘는 경우와 여러 번의 다단히트가 같은 프레임에 들어오는 경우를 각각 테스트해야 한다.
단일 강타
단일 공격의 초과분은 AbsorbedDamage로 기록하고 실제 피해 숫자는 AppliedDamage만 표시한다. Gate에 도달했다면 보스의 피격 경직을 별도로 줄이거나 막을지 결정해야 한다. 피해는 막혔지만 경직은 발생하는 설계는 플레이어에게 강력한 공격이 여전히 유효하다는 인상을 줄 수 있다.
다단히트
다단히트는 각 히트마다 Gate를 계산하면 마지막 히트만 일부 적용된다. 이것이 의도라면 마지막 히트에서 Gate 이펙트를 발생시켜야 한다. 반대로 한 스킬을 하나의 행동 단위로 취급하려면 스킬 시작 시점에 피해 예산을 예약하는 방식도 사용할 수 있다.
어떤 방식을 선택하든 문서화해야 하는 규칙은 다음과 같다.
- 한 스킬의 히트별로 Gate를 계산하는가?
- 투사체가 이미 발사된 뒤 전환이 시작되면 어떻게 처리하는가?
- 지속 피해와 소환수 피해는 전환 중에도 계속 적용되는가?
- 반사 피해와 자해 피해는 Gate의 영향을 받는가?
공정한 무적 연출을 위한 파라미터 튜닝
수치 튜닝은 무적 시간 하나만 줄이는 방식으로 접근하면 안 된다. 다음 파라미터를 함께 조절해야 한다.
| 파라미터 | 역할 | 테스트 질문 |
|---|---|---|
H_warn | 전환 사전 경고 지점 | 플레이어가 다음 행동을 예측할 수 있는가? |
H_gate | 실제 체력 고정 지점 | 강한 공격이 의도치 않게 페이즈를 건너뛰지 않는가? |
warnLeadTime | 경고 지속 시간 | 일반 공격과 필살기 모두에게 충분한가? |
invulnerableDuration | 전환 무적 시간 | 연출에 필요한 최소 시간인가? |
recoverWindow | 전환 후 공격 가능 구간 | 복귀를 확인할 시간이 있는가? |
gateFeedbackCooldown | 반복 이펙트 제한 | 다단히트가 화면을 과도하게 채우지 않는가? |
초기 테스트에서는 다음 조건을 확인한다.
- 낮은 DPS 빌드가 임계값과 전환 종료를 이해할 수 있는가?
- 높은 DPS 빌드가 한 번의 공격으로 다음 페이즈를 건너뛰지 않는가?
- 지속 피해가 전환을 반복해서 재시작하지 않는가?
- 전환 종료 직후 공격 입력이 무시되지 않는가?
- 경고 이펙트를 보지 못한 플레이어도 사운드와 UI로 상태를 알 수 있는가?
접근성까지 포함한 Damage Gate 피드백
색상 변화만으로 Gate 상태를 전달하면 색각 이상 사용자나 밝은 배경에서 플레이하는 사용자가 정보를 놓칠 수 있다. 최소 두 가지 이상의 채널을 조합한다.
- 색상: 보호막 색상이나 체력 바 변화
- 형태: 체력 바 마커, 아이콘, 보스 문양
- 소리: Gate 접촉음과 무적 시작·종료음
- 문자: 페이즈 이름 또는 짧은 상태 메시지
- 진동: 컨트롤러에서 차단과 종료를 다른 패턴으로 구분
화면 흔들림, 플래시, 큰 음량의 효과음은 옵션으로 조정할 수 있게 하고 핵심 정보는 해당 효과가 꺼져도 남아 있어야 한다.
QA 체크리스트
| 테스트 상황 | 기대 결과 |
|---|---|
| 임계값보다 큰 단일 피해 | 체력은 H_gate에서 멈추고 Gate 피드백 발생 |
| 같은 프레임의 다단히트 | 정의된 히트 순서와 적용 규칙이 일관됨 |
| 전환 중 DoT | 피해 적용 또는 흡수 규칙이 문서와 일치함 |
| 전환 직전 발사된 투사체 | 서버 판정 기준으로 결과가 결정됨 |
| 반사·카운터 피해 | 일반 피해와 동일한 Gate 규칙을 따름 |
| 네트워크 지연 | 체력 바, 보스 상태, 피해 숫자가 최종 판정과 수렴함 |
| 사운드와 화면 흔들림 비활성화 | 상태 구분에 필요한 정보가 남아 있음 |
| 전환 종료 프레임에 입력 | 공격 가능 여부가 매번 동일함 |
| 보스 처치와 전환 조건이 같은 프레임 | 우선순위 규칙에 따라 중복 전환이 발생하지 않음 |
자주 묻는 질문 (FAQ)
Damage Gate와 무적 상태를 같은 시스템으로 만들어도 되나요?
판정 계층은 공유할 수 있지만 피드백 이벤트는 분리하는 것이 좋다. Gate는 임계값까지 피해가 적용될 수 있고 무적 상태는 피해가 전혀 적용되지 않으므로 플레이어가 받아야 할 정보가 다르다.
Gate에서 막힌 초과 피해를 피해 숫자로 보여줘도 되나요?
실제 체력에 적용되지 않은 수치를 일반 피해 숫자로 보여주면 오해가 생긴다. 적용 피해는 일반 숫자로 표시하고 초과분은 GATE, 보호막 충돌, 별도 색상 등으로 구분한다.
무적 연출은 얼마나 길어야 하나요?
고정된 정답은 없다. 전환에 필요한 최소 연출 시간을 기준으로 설정한 뒤 플레이어가 무적 시작과 종료를 즉시 식별할 수 있는지 테스트해야 한다. 전투 템포가 빠를수록 긴 카메라 연출보다 짧고 명확한 신호가 적합하다.
정리
공정한 보스 페이즈 전환은 무적 시간을 무조건 줄이는 문제가 아니다. H_warn으로 전환을 예고하고 H_gate에서 체력을 명확히 고정하며 공격 접촉·피해 흡수·무적 시작·무적 종료를 서로 다른 피드백으로 전달해야 한다.
Damage Gate의 성공 기준은 플레이어가 모든 피해를 입히는 것이 아니라 공격이 왜 막혔는지 보스가 무엇을 준비하는지 언제 다시 공격할 수 있는지를 예측할 수 있는 것이다. 이 규칙을 전투 로직, UI, 애니메이션, 사운드, 네트워크 판정에 일관되게 연결하면 페이즈 전환은 손실처럼 보이는 무적이 아니라 학습 가능한 전투 패턴이 된다.



