AI 에이전트 몬스터 어그로 분산과 협동 공격 패턴 설계 가이드
몬스터의 타깃 집중과 동시 공격을 조절하기 위한 설계안을 정리한다. 위협도 점수, 역할 슬롯, 타깃 예약, 협동 공격 상태 전이의 계산과 테스트 기준을 제안한다.

핵심 요약
이 글의 AI 에이전트 몬스터 설계안은 위협도 점수·역할 슬롯·공격 가능 여부를 함께 판단한다. 각 몬스터가 위협도 테이블을 참고하되 현재 타깃에 몰린 공격자 수와 협동 패턴의 예약 상태에 페널티를 적용하는 방식을 출발점으로 제안한다. 특정 상용 게임의 내부 구현을 설명하는 것은 아니다.
이 설계안은 탱커 압박·후방 견제·측면 돌진을 역할별로 배치하는 데 목적이 있다. 집중 페널티만으로 타깃 수를 엄격히 제한할 수는 없으므로, 동시 공격 상한은 슬롯 승인으로 관리하고 가독성은 플레이 테스트에서 확인한다.
AI 몬스터의 어그로가 한 명에게 집중되는 이유는 무엇인가?
여기서는 피해량, 회복량, 거리 같은 값을 합산해 최고 점수의 플레이어를 선택하는 기준안을 가정한다. 여러 몬스터의 입력과 선택 규칙, 동점 처리까지 같으면 같은 타깃을 고른다. 다음 표는 실제 발생 빈도를 조사한 결과가 아니라 이 기준안에서 테스트할 문제 시나리오다.
| 원인 | 전투에서 보이는 현상 | 설계 문제 |
|---|---|---|
| 피해량 중심 위협도 | 딜러가 모든 몬스터를 끌고 다님 | 탱커 역할이 약해짐 |
| 거리 우선 선택 | 가장 가까운 플레이어에게 군집 | 포지셔닝 선택지가 줄어듦 |
| 타깃 고정 시간 과다 | 한 명이 계속 공격받음 | 회피 실패가 즉시 전멸로 이어짐 |
| 공격 슬롯 미관리 | 모든 근접 몬스터가 동시에 타격 | 피격 판정과 가독성이 나빠짐 |
| 역할 구분 부재 | 원거리·근거리·지원형이 같은 행동 | 몬스터 조합의 개성이 사라짐 |
특히 협동 전투에서 중요한 것은 “누구를 공격할까”보다 “누가 지금 공격해도 되는가”다. 타깃 선택과 공격 실행을 분리하지 않으면 어그로를 분산해도 여러 몬스터가 같은 프레임에 공격하는 문제가 남는다.

어그로 분산은 어떻게 계산할까?
1. 기본 위협도 점수를 만든다
플레이어 에 대한 기본 위협도는 피해, 회복, 도발, 거리, 최근 피격 여부를 조합해 계산할 수 있다.
- : 최근 5초 동안 해당 몬스터에게 준 피해량
- : 최근 5초 동안 해당 플레이어가 자신이나 아군 플레이어에게 제공한 회복 또는 보호량
- : 도발 스킬로 부여한 위협도
- : 해당 몬스터를 최근 공격했을 때의 반응 보정값
- : 몬스터 유형별 가중치
앞서 제시한 최근 5초 합계는 시간 창 밖의 사건을 제외하는 방식이다. 이와 다른 대안으로 이벤트 발생 시 위협도를 누적하고 시간에 따라 지수 감쇠시킬 수도 있다. 아래 식은 과거 기여가 5초에 완전히 사라지는 합계와 같지는 않다.
시간을 초 단위로 두고 로 정하면 약 1.98초마다 과거 기여가 절반으로 줄어든다. 모든 플레이어 점수에 같은 감쇠만 적용하면 상대적인 순위는 그대로이므로 이것만으로 타깃이 바뀐다는 보장은 없다. 새로운 위협 이벤트와 다른 점수 항목을 함께 평가한다.
2. 집중 페널티와 역할 보정을 더한다
최종 타깃 점수에는 이미 해당 플레이어를 공격 중인 아군 수를 반영한다.
여기서 는 집중 페널티다. 근접 공격자 3명이 이미 플레이어 A를 노린다면 네 번째 몬스터는 플레이어 B가 조금 낮은 위협도여도 선택할 수 있다. RandomJitter는 점수가 비슷할 때 선택을 분산하기 위한 작은 난수 항이다. 몬스터마다 독립된 난수를 사용하고 전환 빈도를 측정한다. 같은 난수를 공유하면 선택이 같아질 수 있으며 이 항은 동시 공격 수를 제한하지 않는다.
| 몬스터 역할 | 집중 페널티 | 우선 타깃 보정 | 의도 |
|---|---|---|---|
| 근접 일반병 | 높음 | 가장 가까운 빈 슬롯 | 포위 대신 교대 압박 |
| 방패병 | 낮음 | 탱커, 전방 플레이어 | 전선 유지 |
| 궁수 | 중간 | 후방, 체력이 낮은 대상 | 위치 이동 유도 |
| 암살자 | 중간 | 고립된 후방 대상 | 짧고 명확한 위협 |
| 지원형 | 해당 없음 | 아군 보호 대상 | 공격보다 생존 유지 |
3. 타깃 변경에는 히스테리시스를 둔다
이 예제의 점수는 거리·집중 페널티 때문에 음수가 될 수 있다. 현재 점수에 비율을 곱하는 것만으로 비교하면 음수에서 더 낮은 점수의 후보로 전환할 수 있으므로 현재 점수의 절댓값과 절대 최소 차이를 이용해 전환 여유를 둔다.
bool ShouldSwitchTarget(float currentScore, float candidateScore)
{
const float relativeMargin = 0.25f;
const float absoluteMargin = 1f; // 이 예제 점수 단위의 실험값
float margin = UnityEngine.Mathf.Max(absoluteMargin, UnityEngine.Mathf.Abs(currentScore) * relativeMargin);
return candidateScore > currentScore + margin;
}
이 규칙은 작은 점수 변화에 따른 전환을 억제한다. 실제 전투에서는 최소 유지 시간과 예고 행동도 함께 시험한다. 현재 타깃이 사망했거나 사거리·시야 조건을 벗어난 경우에는 점수 여유 조건과 별개로 재선정한다.
협동 공격 패턴은 어떻게 구현할까?
이 설계안에서는 전투 그룹이 공유하는 공격 슬롯과 패턴 예약으로 협동 공격을 조율한다. 이동 경로, 위치 충돌, 예고 행동은 별도의 시스템에서 처리한다.
Step 1. 전투 그룹과 공격 슬롯을 정의한다
몬스터는 스폰 시 또는 플레이어 감지 시 CombatGroup에 등록한다. 그룹은 타깃별로 근접 공격 슬롯 수를 관리한다.
아래 슬롯 수와 이후 70% 점유율 기준은 초기 테스트용 예시이며 모든 게임에 맞는 권장값은 아니다.
| 슬롯 종류 | 시험할 예시 수 | 사용 목적 |
|---|---|---|
| 근접 공격 슬롯 | 1~2 | 실제 타격을 수행할 몬스터 |
| 근접 대기 슬롯 | 2~4 | 포위 위치를 유지하며 교대 준비 |
| 원거리 사격 슬롯 | 1~3 | 투사체 공격의 동시성 제한 |
| 특수 패턴 슬롯 | 1 | 돌진, 잡기, 광역기 예약 |
슬롯 수는 난이도가 아니라 플레이어의 대응 가능성을 기준으로 정한다. 플레이어가 회피 한 번으로 대응할 수 있는 위협은 같은 순간에 하나가 적절하다. 하드 난이도는 슬롯 수를 무작정 늘리기보다 예고 시간 감소, 패턴 조합 변화, 교대 간격 단축으로 압박을 높이는 편이 읽기 쉽다.
Step 2. 공격 실행 전에 슬롯을 예약한다
몬스터는 공격 애니메이션을 시작하기 전 슬롯을 요청하고 승인된 경우에만 공격 상태로 들어간다. 실패하면 대기·재배치·방어막 파괴 같은 보조 행동을 수행한다.
다음 코드는 몬스터 클래스 내부의 메서드 조각이다. CombatGroup, Player, MonsterState, state와 슬롯 메서드는 프로젝트에서 정의해야 하며, 예약과 해제는 같은 그룹·타깃·몬스터를 기준으로 처리한다.
public bool TryStartMeleeAttack(CombatGroup group, Player target)
{
if (!group.TryReserveMeleeSlot(target, this))
return false;
state = MonsterState.Attack;
return true;
}
public void FinishAttack(CombatGroup group, Player target)
{
group.ReleaseMeleeSlot(target, this);
state = MonsterState.Reposition;
}
예약은 공격 모션 시작과 함께 처리하고 피격 판정이 끝나면 즉시 해제한다. 사망, 넉백, 경직, 타깃 소실 같은 인터럽트에서도 해제하지 않으면 슬롯이 영구 점유되는 버그가 생기므로 상태 종료 지점에서 정리해야 한다.
Step 3. 패턴을 상태 전이로 연결한다
협동 패턴은 복잡한 행동 트리보다 작은 상태 전이로 시작하는 편이 검증하기 쉽다.
flowchart LR
A[추적] --> B{공격 슬롯 확보}
B -->|성공| C[공격]
B -->|실패| D[대기 또는 재배치]
C --> E[회복 시간]
E --> A
D --> F{특수 패턴 예약}
F -->|성공| G[돌진 또는 견제]
F -->|실패| A
G --> E
예를 들어 방패병이 전방 슬롯을 점유하면 궁수는 후방 사격 슬롯을 요청하고 암살자는 대상이 고립되었을 때만 특수 패턴 슬롯을 사용한다. 각 몬스터가 독립적으로 판단하되 그룹의 슬롯 제약을 공유하므로 행동은 분산되면서도 전투 목적은 일관된다.
협동 공격 패턴에서 공정함을 유지하는 기준은 무엇인가?
좋은 협동 공격은 강한 공격이 아니라 예측 가능한 위협의 조합이다. 플레이어가 패턴을 알아차릴 수 있고 이동·회피·차단·우선 처치 중 하나를 선택할 수 있어야 한다.
| 패턴 | 텔레그래프 | 대응 수단 | 피해야 할 설계 |
|---|---|---|---|
| 방패병 압박 + 궁수 사격 | 방패 전진, 조준 레이저 | 측면 이동, 궁수 처치 | 시야 밖 즉발 사격 |
| 근접 교대 공격 | 후퇴 몬스터의 빈틈 | 회피 후 반격 | 세 명의 동시 타격 |
| 암살자 돌진 + 일반병 견제 | 돌진 준비 자세, 음향 효과 | 구르기, 차단 | 경직 중 확정 연계 |
| 지원형 보호막 | 연결 이펙트, 시전 시간 | 지원형 우선 처치 | 무한 갱신 보호막 |
협동 패턴에는 반드시 실패 경로가 있어야 한다. 돌진이 빗나가면 암살자는 짧은 경직에 들어가고 지원형의 시전이 끊기면 재시전 대기 시간을 둔다. 이 창이 있어야 몬스터의 협동이 일방적인 자동 처벌이 아니라 플레이어 숙련도에 반응하는 시스템이 된다.
밸런싱은 어떤 지표로 검증해야 할까?
어그로 분산 시스템은 평균 DPS만으로 평가하기 어렵다. 플레이 테스트와 텔레메트리에서 아래 지표를 함께 본다.
| 지표 | 확인할 문제 | 권장 해석 |
|---|---|---|
| 타깃 점유율 | 특정 플레이어 집중 | 한 대상이 70% 이상 점유하면 집중 페널티 점검 |
| 동시 공격 수 | 회피 불가능한 피해 | 근접 피격 프레임이 겹치는지 확인 |
| 타깃 변경 빈도 | AI의 불안정한 이동 | 1초당 전환 횟수가 높으면 전환 임계값 상향 |
| 패턴 성공률 | 협동기의 위협 수준 | 성공률보다 피격 후 대응 가능 여부를 함께 관찰 |
| 지원형 생존 시간 | 우선 처치 목표의 명확성 | 너무 짧으면 역할이 무의미하고 너무 길면 전투가 지연됨 |
먼저 3명 파티와 4~6마리 몬스터라는 작은 조건에서 테스트한다. 적 수와 난이도를 늘릴 때는 같은 규칙을 출발점으로 쓰되 슬롯 경합, 이동 충돌, 예고 가독성을 다시 측정한다. 작은 조건에서의 결과가 큰 전투에서도 유지된다고 가정하지 않는다.
자주 묻는 질문 (FAQ)
어그로를 완전히 균등하게 분배해야 하나요?
아니다. 균등 분배보다 역할에 맞는 제한된 집중이 좋다. 탱커는 더 자주 공격받아야 하지만 모든 근접 공격이 같은 프레임에 몰려서는 안 된다.
몬스터마다 별도 행동 트리를 만들어야 하나요?
필요 없다. 공통 상태 전이와 전투 그룹 슬롯을 공유하고 역할별 가중치와 사용 가능한 특수 행동만 다르게 두면 대부분의 차이를 만들 수 있다.
난이도를 높일 때 공격 슬롯을 늘리면 되나요?
마지막 수단으로 둔다. 먼저 회복 시간, 경고 시간, 재배치 속도, 패턴 순서를 조정한다. 슬롯 증가는 플레이어가 대응할 수 있는 최대 동시 위협을 넘지 않을 때만 사용한다.
정리
AI 에이전트 몬스터의 어그로 분산은 위협도 테이블에 집중 페널티를 더하고 공격 실행을 슬롯 예약으로 제한하는 방식으로 시작할 수 있다. 여기에 역할별 보정과 타깃 전환 임계값을 적용하면 복잡한 군집 AI 없이도 협동하는 적처럼 보이는 전투를 만들 수 있다.
핵심은 몬스터가 모두 다른 플레이어를 공격하게 만드는 것이 아니다. 플레이어가 지금 어떤 위협을 처리해야 하는지 읽고 대응에 성공했을 때 전투의 주도권을 되찾게 만드는 것이다.



