적들은 왜 한 명씩 덤비나 — 공격 허가에 들어가는 네 가지
열 마리에게 둘러싸였는데 실제로 달려드는 건 한두 마리다. 나머지는 주위를 어슬렁거리며 자기 차례를 기다린다. 배트맨을 해 본 사람이면 안다. 어쌔신 크리드도 그렇다.
AI가 판단한 게 아니다. 공격하려면 허가를 받아야 하고, 그 허가가 몇 장뿐이기 때문이다.
그리고 이건 똑똑한 적을 만드는 일이 아니다. 허가를 몇 장 줄지가 곧 그 게임의 난이도이므로, 밸런스 튜닝에 가깝다. 실제로 DOOM(2016)은 난이도를 올리면 토큰 수가 늘어난다 — 적이 영리해지는 게 아니라 동시에 덤빌 수 있는 수가 늘어나는 것이다.
이 글은 그 허가 시스템을 실제로 돌려 본 기록이다. 60fps 난투를 시뮬레이터로 짜고 정책을 바꿔 가며 수천 번 맞아 봤다. 구조와 가중치는 개발자가 직접 쓴 구현 문서를 그대로 따랐고(마지막 절), 시간·피해 값만 내가 정했다.
그리고 미리 짚어 둘 게 하나 있다. 소울라이크는 여기 안 들어간다. 다크 소울이나 엘든 링에서 여럿에게 둘러싸이면 그냥 동시에 맞는다. "갱킹"이라는 말이 괜히 있는 게 아니다. 이 글이 다루는 건 그 반대편에 있는 게임들이다.
난투 하나에 걸려 있던 요구
- 초보자가 압도되면 안 된다. 열 마리가 동시에 후려치면 배울 기회 자체가 없다.
- 그렇다고 한 명씩만 오면 안 된다. 지루하고, 광역기를 쓸 이유가 사라진다.
- 적 종류가 달라도 압박이 비슷해야 한다. 병사 셋과 트롤 셋이 같은 "셋"이면 곤란하다.
- 난이도를 조절할 손잡이가 있어야 한다. 그것도 적 하나하나를 다시 밸런싱하지 않고.
이 네 줄이 네 개의 숫자로 갈라진다. 개체 가중치, 그리드 예산, 공격 가중치, 공격 예산이다. 첫 줄부터 보자 — 애초에 왜 허가가 필요한가.
0. 재현 장치 — 판과 가중치

플레이어를 중심으로 8칸이 둘러싼다. 논문의 표현을 그대로 옮기면 "플레이어를 가운데 둔 틱택토 판"이다. 이 판은 월드 좌표에 붙어 있고 플레이어를 따라 움직인다.
여기에 숫자 네 개가 붙는다.
| 이름 | 뜻 |
|---|---|
| 개체 가중치 | 이 적 하나가 자리를 차지하는 값 (병사 4, 트롤 8) |
| 그리드 예산 | 플레이어를 둘러쌀 수 있는 가중치의 총합 (12) |
| 공격 가중치 | 이 공격 하나가 차지하는 값 (트롤 돌진 6, 병사 베기 3) |
| 공격 예산 | 동시에 쓸 수 있는 공격 가중치의 총합 (10) |
병사는 찌르기(가중치 5, 12피해)와 베기(3, 7피해)를, 트롤은 돌진(6, 30피해)과 곤봉(4, 18피해)을 쓴다. 공격마다 선딜·판정·후딜이 붙어 있고, 끝나면 자리를 반납하고 다시 줄을 선다.
자리와 공격이 별개의 예산이라는 점이 핵심이다. 붙을 수 있느냐(자리)와 붙어서 뭘 쓸 수 있느냐(공격)를 따로 관리한다.
1. 왜 허가가 필요한가
논문이 문제를 직접 적어 뒀다.
"inexperienced players may become overwhelmed by the sheer number of enemies attacking simultaneously, and so these games typically restrict opponents to attacking one at a time."
가장 단순한 해법이 한 번에 한 명이다. 이걸 부르는 이름이 있다.
"Requiring that opponents attack the player one at a time is a technique known as the Kung-Fu Circle, named after classic scenes from martial arts movies in which the protagonist faces off against dozens of foes who launch their attacks one at a time."
쿵푸 서클. 무협 영화에서 주인공이 수십 명에게 둘러싸였는데 한 명씩 덤비는 그 장면에서 따온 이름이다.
문제는 이게 너무 느리다는 것이다. 우리 모델에서 병사 여섯에게 둘러싸여도 0.5초에 들어오는 피해가 12뿐이다. 한 대다. 광역기를 쓸 이유도 없고, 나머지 다섯은 관객이다.
그럼 두세 명쯤 허용하면 되지 않나. 논문이 그것도 막는다.
"A naïve approach might be to simply allow two or three enemies to attack simultaneously, but this will not account for different enemy types or the relative strength of their attacks."
이 문장이 이 글에서 잰 것의 전부다. 재 보자.
2. "세 명 허용"이 왜 안 되나
같은 적 구성 세 가지를 세 가지 정책으로 60초씩 돌렸다. 재는 값은 0.5초 안에 한꺼번에 들어온 피해의 최대치다.

| 정책 | 병사 6 | 트롤 3 | 혼합 | 최대/최소 |
|---|---|---|---|---|
| 쿵푸 서클 (1명) | 12 | 30 | 30 | 2.50배 |
| 나이브 (3명) | 36 | 78 | 72 | 2.17배 |
| 가중치 방식 | 24 | 30 | 37 | 1.54배 |
같은 세 명 허용인데 병사면 36, 트롤이면 78이 들어온다. 2.2배다. 설계자가 "동시에 셋까지"라고 정했을 때 머릿속에 있던 그림은 하나인데, 실제로 만들어지는 압박은 방에 뭘 배치했느냐에 따라 두 배씩 출렁인다.
가중치로 세면 24~37로 붙는다. 트롤은 가중치가 8이라 예산 12 안에 하나밖에 못 들어오고, 병사는 4라 셋이 들어온다. 자리를 인원이 아니라 가중치로 파니까 "위험한 놈은 자리를 많이 먹는다"가 자동으로 성립한다.
척도를 잘못 고르면 결론이 뒤집힌다
솔직히 적어 둘 게 있다. 처음에는 평균 피해량으로 쟀다. 그랬더니 정반대 결과가 나왔다.

| 정책 | 병사 6 | 트롤 3 | 혼합 | 최대/최소 |
|---|---|---|---|---|
| 쿵푸 서클 | 7.5 | 11.9 | 9.4 | 1.59배 |
| 나이브 (3명) | 22.2 | 25.7 | 26.3 | 1.18배 |
| 가중치 방식 | 24.6 | 12.5 | 19.2 | 1.97배 |
평균으로 보면 나이브가 제일 고르다. 논문 주장이 반박되는 것처럼 보인다.
그런데 평균이 재는 건 "60초 동안 총 얼마나 맞았나"다. 플레이어가 죽는 건 총량 때문이 아니라 트롤 셋이 동시에 후려치는 그 0.5초 때문이다. 그 순간은 평균에 묻힌다. 논문이 문제를 "overwhelmed by the sheer number of enemies attacking simultaneously"라고 적었으니, 척도도 동시성이어야 했다.
시스템을 평가할 때 척도를 그 시스템이 풀려는 문제에서 가져오지 않으면, 멀쩡한 시스템이 거꾸로 보인다.
3. 허가가 나가는 순서
논문 28.3절의 예시를 그대로 따라가 보자.

- 병사가 요청한다. 가중치 4, 남은 예산 12. 통과 → 남은 예산 8
- 트롤이 요청한다. 가중치 8, 남은 예산 8. 통과 → 남은 예산 0
- 병사가 또 요청한다. 가중치 4 > 남은 0. 거절. 판 밖에서 대기
이 판정을 개체가 스스로 하지 않는다는 게 중요하다. 스테이지 매니저라는 중앙 관리자가 전부 쥐고 있다.
"Creatures would never remember their grid slot assignments and were responsible for checking with the stage manager to get their current slot assignments every frame."
적은 자기 자리를 기억하지 않는다. 매 프레임 다시 물어본다. 그래야 플레이어가 굴러서 반대편으로 빠졌을 때 매니저가 허가를 회수해 더 가까운 놈에게 넘길 수 있다. 논문은 이걸 "슬롯을 훔친다"고 표현한다.
우리 시뮬레이터에서 이걸 빼먹고 자리를 한 번 잡으면 계속 들고 있게 짰더니, 먼저 붙은 셋이 영원히 독점해서 뒤에 선 적은 60초 내내 한 번도 못 붙었다. 적 구성을 바꿔도 결과가 똑같이 나와서 알아챘다. 회전이 이 시스템의 절반이다.
그리고 자리를 받았다고 아무 공격이나 쓰는 게 아니다. 여기서 두 번째 예산이 붙는다. 공격 예산이 10일 때 트롤이 돌진(6)을 집으면 남는 건 4다. 병사는 찌르기(5)를 쓰고 싶어도 예산이 모자라 베기(3)로 내려간다.
혼합 구성 60초에서 실제로 나간 공격을 세 보면 이렇다.
| 정책 | 나간 공격 | 센 공격 비율 |
|---|---|---|
| 가중치 방식 | 병사 베기 10 · 병사 찌르기 50 · 트롤 곤봉 10 · 트롤 돌진 10 | 75.0% |
| 나이브 (3명) | 병사 베기 32 · 병사 찌르기 43 · 트롤 곤봉 20 · 트롤 돌진 16 | 53.2% |
예상과 반대로 예산제 쪽이 센 공격 비율이 높다. 붙는 놈이 적으니 예산이 남고, 남으면 제일 센 걸 집기 때문이다. 적게 붙되 제대로 때린다 — 이게 "허가받은 한 놈이 무섭게 들어온다"는 체감의 정체다.
4. 난이도를 올린다 = 예산을 올린다
여기가 이 시스템을 쓰는 진짜 이유다.

| 그리드 예산 | 공격 예산 | 둘러싼 인원 | 동시 공격 최대 | 0.5초 버스트 |
|---|---|---|---|---|
| 8 | 6 | 2.0명 | 1명 | 12 |
| 12 | 10 | 2.2명 | 2명 | 37 |
| 16 | 14 | 2.4명 | 3명 | 60 |
| 24 | 20 | 3.4명 | 4명 | 61 |
| 32 | 28 | 3.7명 | 5명 | 96 |
두 예산은 따로 도는 값이다 — 그리드 예산이 몇이 붙을 수 있나, 공격 예산이 붙은 놈이 뭘 쓸 수 있나다. 여기서는 둘을 같이 올렸다.
버스트가 12에서 96으로, 여덟 배가 된다. 그런데 적은 하나도 안 세졌다. 병사는 여전히 가중치 4에 찌르기 12피해고, 트롤도 그대로다. 바뀐 건 "몇이 동시에 덤벼도 되나"뿐이다.
논문이 이걸 장점으로 명시한다.
"we scaled up the grid and attack capacities accordingly ... without changing the carefully balanced individual grid and attack weight set for each creature."
난이도 하나 올리려고 적 수십 종의 체력과 데미지를 다시 만지는 대신, 플레이어 쪽 숫자 두 개를 올린다. 어려운 난이도에서 적이 더 아프게 때리는 게 아니라 더 많이 붙는 것이다. DOOM(2016)도 같은 구조를 쓰는데, 거기서는 공격 종류마다 토큰 풀이 따로 있고 난이도가 곧 토큰 수다.
5. 가중치는 "연속 손잡이"가 아니다
마지막으로 잰 게 제일 뜻밖이었다. 압박을 병사 구성과 맞추려면 트롤 가중치를 얼마로 둬야 하나. 2부터 16까지 훑었다.

| 트롤 가중치 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 |
|---|---|---|---|---|---|---|---|---|
| 버스트 | 48 | 48 | 48 | 30 | 30 | 30 | 0 | 0 |
가중치 8·10·12가 결과가 완전히 같다. 당연하다 — 예산이 12니까 그 셋 중 뭘 골라도 트롤은 하나만 들어온다. 6 이하면 둘이 들어오고, 14 이상이면 아예 못 들어온다.
즉 가중치는 압박을 조금씩 조절하는 다이얼이 아니라 몇 마리가 들어오느냐를 정하는 계단이다. 가중치를 8에서 10으로 올리는 건 아무 일도 안 하는 변경이고, 6에서 8로 올리는 건 적 하나를 통째로 빼는 변경이다.
기준(병사 여섯)의 버스트가 24였으니 가장 가까운 계단이 30짜리고, 논문의 예시값 8이 그 계단 안에 있다. 다만 이건 우리 모델의 시간·피해 값으로 나온 것이라 "논문값이 검증됐다"고 읽으면 안 된다. 읽어야 할 건 이쪽이다 — 가중치는 실제 전투 값과 같이 맞춰야 의미가 생긴다. 논문이 "carefully balanced"라고 쓴 그 작업이 계단 어느 칸에 설지 고르는 일이다.
6. 실제 게임은 어떻게 하나
여기까지는 내 모델이다. 확인된 것만 적는다.
Kingdoms of Amalur: Reckoning — 위에서 계속 인용한 논문이 이 게임의 구현 문서다. 개발자가 직접 썼고, 사내 명칭이 재밌다.
we employed an approach known internally as the "Belgian AI" system (so-called for the iconic sketches of waffles used to describe the algorithm)
알고리즘을 설명할 때 그린 그림이 와플처럼 생겨서 붙은 이름이다.
DOOM (2016) — 공격 종류별 토큰 풀을 쓴다.
"DOOM uses a combat system that requires that demons ask to attack the player. This is achieved using a token system, where each type of attack - be it melee, ranged, charged or otherwise - has a limited number of tokens available at a given point in time. A demon needs to request a token to make their attack, then release the token back to the system after use."
난이도마다 공격 종류별 토큰 수가 다르다는 설명도 이어진다. Amalur가 가중치로 예산을 짠다면 DOOM은 종류별로 칸을 나눈 셈이다.
God of War — 시리즈 컴뱃 디자이너 Alex Sulman의 말이 인용돼 있다. 적의 공격을 조율하는 이유는 "모두가 한꺼번에 덤비는 그 혼란을 막기 위해"이고, 갓 오브 워 3에서는 평균 2~3초에 한 번꼴로 공격이 나가게 잡았다.
헤일로 2는 이 계열이 아니다. 처음에는 여기도 토큰이 있을 거라 생각하고 GDC 2005 논문을 찾아 읽었는데, 토큰·라이선스·공용 풀이 전혀 나오지 않는다. 대신 분대(squad)와 영역(area), 그리고 분대에 내리는 명령(order)으로 대형과 지시를 다룬다. 같은 "여럿을 상대하는 문제"인데 접근이 아예 다르다.
정리
기획 네 줄이 어디로 갔는지 되짚으면 이렇다.
- 초보자가 압도되면 안 된다 → 쿵푸 서클 → 그런데 병사 여섯에 버스트 12는 너무 심심하다
- 적 종류가 달라도 압박이 비슷해야 한다 → 개체 가중치 + 그리드 예산 → 3명 허용은 2.17배 출렁이고 가중치 방식은 1.54배
- 붙어서 쓰는 공격도 통제해야 한다 → 공격 가중치 + 공격 예산 → 예산이 모자라면 찌르기 대신 베기로 내려간다
- 난이도 손잡이가 있어야 한다 → 예산만 올린다 → 버스트 12 → 96, 적은 하나도 안 세졌다
적들이 한 명씩 덤비는 건 허가가 몇 장뿐이기 때문이다. 그리고 그 장수가 곧 난이도다 — 다음에 난이도를 한 칸 올려 보면, 적이 세지는 게 아니라 더 많이 붙는다. 그리고 그 허가를 인원으로 세느냐 가중치로 세느냐가 이 시스템의 전부다. 인원으로 세면 방에 뭘 놓느냐에 따라 난이도가 제멋대로 변하고, 가중치로 세면 "위험한 놈은 자리를 많이 먹는다"가 규칙이 된다.
한 가지만 더. 이 시스템은 압박을 자동으로 맞춰 주지 않는다. 맞출 손잡이를 줄 뿐이고, 그 손잡이는 계단이라 몇 칸밖에 없다. 어느 칸에 설지는 사람이 정한다 — 게임에서 "밸런싱"이라고 부르는 일이 대개 그 칸을 고르는 일이다.
참고 자료
- Michael Dawe, "Beyond the Kung-Fu Circle: A Flexible System for Managing NPC Attacks", Game AI Pro Ch.28 (PDF) — 이 글의 뼈대. Kingdoms of Amalur: Reckoning 의 개발자가 직접 쓴 구현 문서다. 개체 가중치·공격 가중치·예산이라는 이름과 예시 수치(병사 4 / 트롤 8 / 예산 12·10), 스테이지 매니저, "Belgian AI" 명칭의 유래가 전부 여기 있다.
- Tommy Thompson, "Cyber Demons: The AI of DOOM (2016)", Game Developer (2018) — DOOM 의 공격 종류별 토큰 풀과 난이도별 토큰 수. 근거로 id Software 의 GDC 강연 둘(Kurt Loudy 2018, Jake Campbell 2017)을 인용하고 있다.
- Bart Vossen, "Enemy design and enemy AI for melee combat systems", Game Developer (2015) — God of War 컴뱃 디자이너 Alex Sulman 등 현업 인터뷰. 모두가 한꺼번에 덤비는 혼란을 막기 위해 인용의 출처다.
- Damian Isla, "Handling Complexity in the Halo 2 AI", GDC 2005 Proceeding — 헤일로 2 에는 토큰 시스템이 없다는 것을 확인한 원문. 대신 분대·영역·명령 구조를 쓴다.
이 글의 시간·피해 수치는 위 게임들의 값이 아니다. 가중치와 예산만 논문 예시값을 쓰고, 공격 프레임과 피해량은 직접 정해 돌린 결과다. 세 정책의 비교만이 논문 주장의 검증이고, 절대 수치는 내 모델의 값이다.
'게임개발뜯어보기' 카테고리의 다른 글
| 내 화면에선 분명 맞았는데 - 랙 보상으로 서버가 시간을 되감는 법 (0) | 2026.08.29 |
|---|---|
| 규칙만 적으면 맵이 나온다 - 파동함수 붕괴(WFC)가 하는 일과 못 하는 일 (0) | 2026.08.28 |
| 액션 게임 조작감은 어떻게 튜닝되나 - 인풋 버퍼와 링크 창 (0) | 2026.08.26 |
| 스프레이 패턴은 왜 외워지나 - 고정 반동 표와 랜덤 탄 퍼짐 (0) | 2026.08.25 |
| 이 게임 점프는 왜 손에 붙나 - 코요테 타임과 점프 버퍼 (0) | 2026.08.24 |