
데미지 오버 타임(DoT)과 CC기를 지배하는 상태 이상 시스템 연산 규칙 설계
화염·중독의 지속 피해(DoT)와 빙결·감전 등 군중 제어(CC) 효과의 중첩, 틱 처리, 우선순위 연산 및 스태킹 규칙을 체계적으로 다룹니다.
1. 상태 이상 시스템의 분류와 데이터 구조
현대 RPG 및 액션 게임에서 상태 이상(Status Effect)은 전투의 깊이를 결정하는 핵심 메커니즘입니다. 상태 이상은 크게 지속 피해(Damage over Time, DoT), 군중 제어(Crowd Control, CC), 능력치 변동(Buff/Debuff)으로 분류됩니다. 화염이나 중독은 정해진 시간 동안 주기적으로 데미지를 입히는 DoT에 해당하며 빙결과 감전은 행동을 제한하거나 원소 반응을 유발하는 CC기 성격이 강합니다.
이러한 상태 이상을 유연하게 확장하기 위해서는 이펙트 데이터(ScriptableObject 또는 DataAsset)와 실행 중인 인스턴스(Effect Instance)를 분리하는 데이터 구조가 필요합니다.

다음 다이어그램은 피격 대상에게 상태 이상이 부여되고 평가되는 기본적인 생명주기를 나타냅니다.
graph TD
A[상태 이상 부여 요청] --> B{면역 및 저항 판정}
B -- 면역 --> C[효과 무효화]
B -- 적용 가능 --> D{기존 이펙트 존재 여부}
D -- 존재함 --> E[중첩 및 지속시간 갱신]
D -- 없음 --> F[신규 이펙트 생성]
E --> G[주기적 틱 및 효과 연산]
F --> G
G --> H{지속시간 만료?}
H -- 아니오 --> G
H -- 예 --> I[이펙트 제거 및 스탯 원복]
2. 지속 피해(DoT) 연산 규칙: 틱(Tick)과 중첩(Stacking)
지속 피해 시스템을 구현할 때 핵심은 틱 주기와 중첩(Stacking) 정책입니다. 틱 연산은 매 프레임 실행 시 불필요한 성능 손실이 발생하므로 고정된 시간 간격(예: 0.5초 또는 1초)으로 처리합니다.
동일한 DoT 효과가 중복 부여될 때 적용할 수 있는 주요 중첩 정책은 다음과 같습니다.
- 지속시간 갱신형(Refresh Duration): 기존 피해량 수치는 유지하면서 지속시간만 초기화합니다.
- 강도 중첩형(Intensity Stacking): 동일한 DoT가 들어올 때 중첩 중량(Stack Count)을 늘려 틱당 피해량을 증가시킵니다.
- 독립 인스턴스형(Independent Instances): 부여된 모든 DoT를 별개의 타이머와 피해량을 가진 인스턴스로 각각 유지합니다.
DoT의 틱당 최종 피해 계산식은 저항력과 보정 계수를 반영하여 다음과 같이 연산됩니다.
다음은 C# 기반의 DoT 틱 처리 및 중첩 관리 예시 코드입니다.
public class StatusEffectManager : MonoBehaviour
{
private List<EffectInstance> activeEffects = new List<EffectInstance>();
public void ApplyEffect(EffectData data, GameObject caster)
{
var existing = activeEffects.Find(e => e.Data.id == data.id);
if (existing != null)
{
if (data.stackPolicy == StackPolicy.RefreshDuration)
{
existing.ResetDuration();
}
else if (data.stackPolicy == StackPolicy.IntensityStacking)
{
existing.AddStack();
}
}
else
{
activeEffects.Add(new EffectInstance(data, caster));
}
}
private void Update()
{
float deltaTime = Time.deltaTime;
for (int i = activeEffects.Count - 1; i >= 0; i--)
{
var effect = activeEffects[i];
effect.UpdateTick(deltaTime);
if (effect.IsExpired)
{
effect.OnRemove();
activeEffects.RemoveAt(i);
}
}
}
}
3. 군중 제어(CC)기 우선순위와 점증 감쇄(Diminishing Returns)
빙결, 기절(Stun), 속박(Root), 침묵(Silence) 등의 CC기는 캐릭터의 이동이나 기술 사용을 직접 제어합니다. 복수의 CC기가 동시에 부여될 때는 우선순위 비트마스크(Bitmask)나 상태 머신(State Machine)을 통해 최우선 행동 제어 상태를 결정해야 합니다.
예를 들어 빙결(이동 및 공격 불가) 상태는 슬로우(이동 속도 감소) 상태보다 상위 우선순위를 가집니다. 이때 하위 상태는 제거되는 것이 아니라 내부 타이머를 유지하되 제어 권한만 최상위 CC에 넘겨주는 형태가 바람직합니다.

연속적인 CC기 적중으로 인한 무한 기절(Stun Lock)을 방지하기 위해 많은 게임이 점증 감쇄(Diminishing Returns) 공식을 채택합니다. 동일한 분류의 CC기가 일정 시간 이내에 연속 적용될 경우 실제 적용되는 지속시간은 다음과 같이 계산됩니다.
중첩 횟수가 일정 수준에 달하면 CC 면역 상태로 전환되어 게임 밸런스를 보호합니다.
4. 원소 반응과 상호작용 연산(Elemental Reaction)
최신 RPG 게임에서는 서로 다른 상태 이상이 만났을 때 발생하는 원소 반응 연산 규칙이 중요합니다. 예를 들어 젖음(Wet) 상태의 대상에게 냉기(Cold) 피해가 들어가면 빙결(Freeze) 상태로 전이되거나 화염(Burn) 상태에 기름(Oil) 효과가 더해지면 추가 폭발 피해를 일으키는 방식입니다.
이러한 상호작용을 처리하기 위해 상태 이상 적용 시점에 태그 기반의 연산 테이블을 조회하도록 설계합니다.
graph LR
A[대상 상태: 젖음] --> B{신규 적용 태그}
B -- 냉기 --> C[상태 전환: 빙결]
B -- 감전 --> D[범위 전파: 감전]
B -- 화염 --> E[상태 증발: 피해 감쇄]
상태 이상 시스템 설계 시 단순한 피해량 가산에 그치지 않고 중첩 제어, 지속시간 계산 그리고 CC기 간의 제어권 점유 규칙을 명확히 정의하면 확장성 높고 매끄러운 전투 경험을 제공할 수 있습니다.


