턴제 게임에서 캐릭터가 상태 이상을 갖는 것은 비교적 흔한 일이다. 우리 게임에서도 이게 필요했기에 구현을 해 나갔다.
게임의 특징을 되짚어보자면,
- 턴제이지만 속도 기반이라, 여러 캐릭터가 동등하게 차례를 하나씩 갖지 않는다. 예를 들어 속도가 빠른 캐릭터 A가 있고, 속도가 느린 캐릭터 B가 있다고 하자. A가 두 번 행동할동안 B는 한 번만 행동하게 되는 경우가 존재한다. 또한 A가 "느린" 스킬을 사용하면 속도가 빠름에도 불구하고 B와 같은 빈도로 행동하게 될 수도 있다. 즉, 캐릭터와 스킬 모두에 속도 개념이 존재하고, 시스템에는 이를 관리하기 위한 내부적인 턴 타이머가 존재한다. 이를 전투 시간이라 부르겠다.
- 상태 이상은 캐릭터의 행동 차례가 되었을 때, 특정 행동을 했을 때, 일정 전투 시간이 지났을 때, 혹은 제거되었을 때 발동하는 등의 여러 유형이 있다. 독, 재생과 같은 지속형 효과는 일정 전투 시간마다 발동되는게 자연스럽고, [다음 피해 3번이 강화]되는 상태 이상은 특정 행동을 했을 때마다 발동되는게 자연스럽다. 이렇듯 여러 유형의 상태 이상을 구현할 수 있어야 했다.
캐릭터와 상태이상의 처리
우선 캐릭터는 전투 중에 턴 타이머 기반으로 작동한다.
- 전투 중인 모든 캐릭터를 TurnManager 에 등록한다. 각 캐릭터는 다음 행동이 가능한 타이머(NextTurnTime)를 갖고, 이 타이머 순으로 정렬되어 저장된다.
- TurnManager 는 NextTurnTime 이 가장 작은 것을 꺼내온다(Priority Queue로 구현). 각 캐릭터의 유형에 따라 어떤 작업을 할지 정하는데, 아군 캐릭터라면 무슨 행동을 할지 사용자가 선택할 수 있게 하고 적군 캐릭터라면 게임이 알아서 골라준다. 이 작업을 행동 차례 처리라 부르자. TurnManager는 전투가 끝났다고 판단될 때까지 행동 차례 처리를 반복한다.
여기서 각 상태 이상 유형을 어떻게 처리할 수 있을지 생각해보자.
- 행동 차례가 되었을 때, 특정 행동을 했을 때: TurnManager가 행동 차례 처리 를 하거나 특정 행동이 된 시점에 상태 이상에 등록된 함수를 실행한다. 예를 들면 다음 코드와 같을 것이다. 굉장히 쉽다.
public void ProcessEntityAction(EntityModel entity)
{
foreach (StatusEffectModel ste in entity.StatusEffects)
{
ste.OnActionStart();
}
}
- 일정 전투 시간이 지났을 때 / 일정 전투 시간마다 발동: 약간 까다로울 수 있는 케이스지만 그냥 TurnManager에 넣는 요소로 생각하면 쉽다.
캐릭터는 NextTurnTime으로 다음에 행동할 시점을 정할 수 있다. 그렇다면 상태 이상을 캐릭터처럼 취급하고 속도를 부여한다면, 일정 전투 시간마다 작동하는 것을 아주아주 쉽게 구현할 수 있다. 상태 이상과 캐릭터를 CombatElement라는 상위 class로 묶어 TurnManager에 관리하게 시키면 매우 쉬워진다.
상태 이상은 지속 시간을 가지는 것도 있을 수 있으므로 지속 시간 확인도 필요하다. 이는 Expired 라는 flag를 두어 확인할 수 있다. 지속 시간이 다 되었거나 강제로 제거되었다는 등의 이유로 만료 처리된 상태 이상은 TurnManager가 별도로 처리한다.
public void ProcessElementAction(CombatElement element)
{
switch (element)
{
case EntityCombatElement entity:
{
foreach (StatusEffectModel ste in entity.StatusEffects)
{
ste.OnActionStart();
}
break;
}
case StatusEffectCombatElement steElement:
{
if (steElement.Expired) return;
steElement.OnPeriod();
break;
}
}
}
- 제거되었을 때: TurnManager가 지속 시간이 다 되었거나 강제로 제거되는 등의 이유로 만료된 상태 이상을 제거할 때, 비슷한 방식으로 관련 함수들을 호출하면 된다.
애니메이션은 어떻게?
이전 글 에서는 애니메이션을 구현할 때, 먼저 액션이 트리를 순회하듯 처리되고 그 과정에서 애니메이션 트리가 구축되는 방식을 사용했다고 했다. 마찬가지로 상태 이상도 똑같이 해주면 된다. 상태 이상이 특정 효과(액션)를 일으키면, 연쇄적으로 파생 액션이 생성되어 처리되는 방식이다. 구조를 잘 만들어 둔 것 같아 뿌듯하다.
'Unity, 게임 개발' 카테고리의 다른 글
| 2026.05.13 (수) - 유물과 전투 연결 구현 (0) | 2026.05.14 |
|---|---|
| 2026.02.28 (토) 턴제 애니메이션 구현하기 (0) | 2026.02.28 |
| 2026.02.09 (월) (0) | 2026.02.10 |
| 2026.02.02 (월) (1) | 2026.02.03 |