강화학습(RL) 몬스터 공격 패턴 학습: 플레이어별 페이즈 전환 설계 가이드

강화학습(RL)으로 몬스터가 플레이어의 회피·공격 습관을 관찰하고 공정성을 해치지 않으면서 공격 패턴과 보스 페이즈를 맞춤 전환하는 설계 방법을 정리한다.

✓ 복사 완료!
챕터전투 AI & 전술 시스템
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
강화학습(RL) 몬스터 공격 패턴 학습: 플레이어별 페이즈 전환 설계 가이드

핵심 요약

RL 기반 몬스터는 플레이어의 행동을 그대로 흉내 내는 것이 아니라 최근 전투에서 관측한 회피 방향·거리 유지·스킬 사용 시점으로 상태를 만들고 공격 선택의 기대 보상을 학습한다. 실서비스에서는 온라인 학습을 그대로 노출하기보다 오프라인으로 정책을 학습한 뒤 플레이어별로 검증된 패턴 가중치와 페이즈 전환 임계값만 제한적으로 조정해야 공정성·난이도·재현성을 함께 확보할 수 있다.

RL 몬스터 공격 패턴 학습은 무엇을 해결하는가?

고정 패턴 보스는 공략법이 굳어진 뒤 긴장감을 빠르게 잃는다. 반대로 플레이어를 완벽히 추적하는 AI는 불공정하게 느껴지고 실력 차이가 큰 파티에서는 특정 유저만 지속적으로 압박할 수 있다. 핵심은 ‘잘 맞히는 몬스터’가 아니라 플레이어가 읽고 대응할 수 있는 범위 안에서 전술을 바꾸는 몬스터를 설계하는 데 있다.

강화학습의 에이전트는 전투 상태 s에서 행동 a를 선택하고 보상 r을 받으며 정책을 개선한다. 몬스터의 행동은 단일 공격 버튼이 아니라 텔레그래프가 있는 공격 패턴 묶음으로 설계하는 편이 안정적이다.

πθ(a∣s)=P(a∣s;θ)\pi_\theta(a \mid s)=P(a \mid s;\theta)

여기서 πθ는 몬스터 정책, θ는 학습 파라미터다. 실무에서는 s에 원시 좌표를 과도하게 넣기보다 게임 디자인 언어로 해석 가능한 특징을 넣어야 디버깅과 밸런싱이 가능하다.

플레이어 행동 특징을 입력받아 공격 패턴과 페이즈를 선택하는 RL 보스 AI 개념도

어떤 상태·행동·보상을 설계해야 할까?

상태(State): 플레이어 습관을 짧은 관측 창으로 압축한다

관측 창은 최근 5~10초 또는 최근 3~5회의 공격 교환처럼 짧게 잡는다. 한 세션 전체를 기억하게 하면 초반 실수 하나가 끝까지 따라가고 적응 근거를 플레이어가 이해하기 어려워진다.

상태 특징예시 값설계 목적
거리 구간근접·중거리·원거리돌진, 투사체, 범위 공격 선택
최근 회피 방향 비율좌 0.6 / 우 0.2 / 후 0.2편향된 회피에 대한 견제
회피 무적기 재사용 대기0~1 정규화확정타를 피하고 대응 여지 확보
주력 스킬 사용 직후 여부0 또는 1긴 후딜에만 제한적으로 압박
최근 피격·가드 결과명중, 회피, 가드패턴 효율과 난이도 조절
페이즈 진행도HP, 브레이크 게이지연출과 전투 리듬 유지

플레이어 입력, 정확한 프레임 단위 반응 시간, 보이지 않는 내부 쿨다운처럼 플레이어가 관찰할 수 없는 정보를 상태에 넣으면 AI가 치팅하는 인상을 준다. 서버 권한 게임이라도 몬스터는 플레이어 화면에서 확인 가능한 정보를 중심으로 판단하는 편이 좋다.

행동(Action): 공격이 아니라 읽을 수 있는 패턴을 고른다

행동 공간은 작고 의미 있는 패턴으로 제한한다. 예를 들어 근접 2연타, 느린 강공, 좌측 회피 견제, 거리 이탈, 소환, 패턴 유지처럼 6~12개 정도의 매크로 액션을 둔다. 각 패턴에는 선딜, 경고 영역, 회피 가능 시간, 재사용 대기시간을 고정한다.

패턴대응하는 플레이어 습관안전장치
좌측 훑기왼쪽 회피 반복첫 사용 전 명확한 예고 동작
후방 폭발뒤로만 빠지는 거리 유지최소 안전 거리와 긴 선딜
방어 압박가드 반복가드 파괴가 아닌 스태미나 압박
거리 이탈근접 딜 집중추적 불가 구간을 만들지 않음

보상(Reward): 명중률만 최대화하면 안 되는 이유

피해량만 보상으로 주면 정책은 회피 불가능한 연계나 반복 압박을 찾는다. 보상은 처치 효율과 전투 품질을 함께 반영해야 한다.

rt=0.35Dt+0.20Vt+0.20Nt−0.15Rt−0.10Utr_t = 0.35D_t + 0.20V_t + 0.20N_t - 0.15R_t - 0.10U_t
  • D_t: 몬스터가 준 유효 피해 또는 가드 압박량
  • V_t: 플레이어가 보고 반응할 수 있었던 유효한 패턴 사용 점수
  • N_t: 최근 사용하지 않은 패턴에 주는 다양성 점수
  • R_t: 같은 패턴을 연속 반복한 패널티
  • U_t: 회피 불가 판정, 카메라 사각, 과도한 연계 같은 불공정성 패널티

V_t와 U_t는 분석 로그로 계산한다. 예를 들어 선딜 0.6초 미만의 공격이 적중했거나 피격 직후 회피 불가 상태에서 다음 공격이 적중했다면 불공정성 비용을 부여할 수 있다.

RL 기반 보스 페이즈 전환은 어떻게 구현할까?

페이즈를 HP 70%·40%에서 무조건 전환하면 예측은 쉽지만 개인별 긴장감은 만들기 어렵다. 반대로 AI가 임의로 전환하면 전투 리듬이 무너진다. 따라서 HP 기반의 하드 게이트와 행동 기반의 소프트 조건을 함께 사용한다.

  1. 하드 게이트를 먼저 설정한다. 예를 들어 70% 이전에는 페이즈 2로 넘어갈 수 없고 25% 이하에서는 반드시 최종 페이즈로 진입하게 한다.
  2. 플레이어 대응 지표를 계산한다. 최근 8초의 회피 성공률, 피해 기여도, 회복 아이템 사용 빈도, 몬스터 패턴 반복률을 0~1 범위로 정규화한다.
  3. 전환 후보를 점수화하고 쿨다운으로 제한한다. 점수가 임계값을 넘더라도 직전 전환 후 20초가 지나기 전에는 다시 바꾸지 않는다.

예시 점수는 다음처럼 단순하게 시작할 수 있다.

T=0.45E+0.30C−0.25PT = 0.45E + 0.30C - 0.25P
  • E: 플레이어의 회피·가드 성공률
  • C: 몬스터에게 가한 지속 피해 기여도
  • P: 최근 10초의 몬스터 패턴 반복도

T >= 0.65이면 강압 페이즈 후보, T <= 0.30이면 회복 기회를 주는 완화 페이즈 후보로 둔다. 단, 후보 판정은 전환 명령이 아니다. 페이즈 전환은 반드시 HP 게이트, 최소 지속 시간, 연출 가능 여부를 통과해야 한다.

flowchart TD
    A[전투 로그 수집] --> B[최근 8초 행동 특징 계산]
    B --> C[공격 정책이 패턴 선택]
    B --> D[페이즈 전환 점수 T 계산]
    D --> E{HP 게이트·쿨다운 통과?}
    E -- 아니오 --> C
    E -- 예 --> F{T가 임계값 초과?}
    F -- 예 --> G[강압 또는 완화 페이즈 전환]
    F -- 아니오 --> C
    G --> C

페이즈 전환은 단순 수치 강화보다 전장의 규칙을 하나씩 바꾸는 방식이 좋다. 예를 들어 강압 페이즈에서는 좌측 회피 견제 패턴의 비중을 높이되 광역 공격의 선딜을 0.2초 늘린다. 완화 페이즈에서는 몬스터의 이동을 줄이고 회복 가능한 안전 구간을 제공한다.

Unity ML-Agents로 프로토타입을 만드는 3단계

Unity 6 계열과 Unity ML-Agents에서 PPO(Proximal Policy Optimization)를 시험할 때도 학습 환경과 실제 보스 로직을 분리할 수 있다. 학습 에이전트가 애니메이션 전이와 판정을 직접 제어하는 구성은 재현·디버깅 요구사항을 검토해야 한다.

1. 전투 시뮬레이션과 관측값을 분리한다

MonsterAgent는 관측값과 패턴 선택만 담당하고 실제 피해 판정은 CombatResolver 같은 결정론적 시스템에 위임한다. 학습 중에는 프레임 렌더링을 줄이고 여러 전투 인스턴스를 병렬 실행한다.

public override void CollectObservations(VectorSensor sensor)
{
    sensor.AddObservation(NormalizeDistance(targetDistance));
    sensor.AddObservation(recentDodgeLeftRate);
    sensor.AddObservation(recentDodgeRightRate);
    sensor.AddObservation(targetDodgeCooldown01);
    sensor.AddObservation(targetPostSkillWindow01);
    sensor.AddObservation(bossHealth01);
    sensor.AddObservation(phaseIndex / 3f);
}

public override void OnActionReceived(ActionBuffers actions)
{
    var patternId = actions.DiscreteActions[0];
    combatController.RequestPattern(patternId);
}

2. 패턴별 안전 규칙을 학습 밖에 둔다

RequestPattern()은 쿨다운, 선딜, 캔슬 가능 여부, 직전 패턴 반복 제한을 검사해야 한다. 정책이 선택한 액션이라도 규칙을 위반하면 패턴 유지 또는 안전한 대체 패턴으로 바꾼다. 이것은 학습 실패를 숨기는 장치가 아니라 디자인 계약을 코드로 고정하는 장치다.

3. 배포 시에는 정책 탐색을 끈다

학습에서는 탐색을 허용하지만 실서비스에서는 확률 샘플링 폭을 줄이거나 최고 점수 액션을 선택한다. A/B 테스트용으로만 소수의 플레이어에게 제한된 확률 변형을 노출하고 처치 시간·재도전률·피해 회피 가능성·이탈률을 함께 확인한다.

맞춤형 난이도가 불공정하게 느껴지지 않게 하려면?

플레이어는 AI가 적응하는 사실보다 적응의 결과를 이해할 수 있는지를 기준으로 공정성을 판단한다. 다음 제약은 기획 문서와 코드 양쪽에 명시하는 것이 좋다.

  • 한 전투에서 패턴 가중치 변경은 최대 2~3회로 제한한다.
  • 동일한 견제 패턴은 연속 2회 이상 사용하지 않는다.
  • 페이즈 전환 전에는 고유한 모션, 음향, UI 문구 중 최소 하나를 제공한다.
  • 플레이어의 체력 또는 생존 자원이 낮을 때는 강압 전환 점수에 감쇠 계수를 적용한다.
  • 파티 전투에서는 개인별 약점을 직접 겨냥하지 않고 파티 평균 또는 역할군 단위의 지표를 사용한다.

특히 PvP와 경쟁 요소가 있는 협동 콘텐츠에서는 사용자별 모델을 즉시 학습·배포하지 않는 편이 안전하다. 데이터가 적은 신규 유저는 잘못 분류되기 쉽고 실력에 따른 보상 격차가 경제 시스템까지 번질 수 있기 때문이다.

패턴 가중치와 HP 게이트를 함께 표시한 보스 페이즈 전환 디버그 UI 예시

자주 묻는 질문 (FAQ)

RL 몬스터에 온라인 학습이 꼭 필요한가?

아니다. 운영 재현성과 안전한 롤백이 중요하다면 오프라인 시뮬레이션에서 정책 후보를 평가한 뒤, 실서비스에서는 검증된 후보와 제한된 가중치만 선택하는 방식을 고려할 수 있다.

플레이어가 약점을 공략당했다고 느끼면 어떻게 해야 하나?

개인 약점 하나에 반응하는 빈도를 제한하고 대응 가능한 텔레그래프와 반대 선택지를 제공해야 한다. 예를 들어 왼쪽 회피를 견제했다면 오른쪽 회피나 가드가 유효하게 작동해야 한다.

학습 데이터가 부족하면 무엇부터 시작해야 하나?

처음부터 RL을 도입하지 말고 규칙 기반 상태 머신으로 동일한 상태·행동·보상 지표를 수집한다. 로그가 쌓인 뒤 패턴 선택 가중치 최적화처럼 좁은 문제부터 PPO나 밴딧 모델을 적용하는 편이 효율적이다.

정리

RL 기반 몬스터 설계의 목표는 플레이어를 이기는 AI가 아니라 플레이어의 전술 변화에 반응하면서도 읽을 수 있는 전투를 만드는 것이다. 관측값은 짧고 설명 가능하게, 행동은 텔레그래프가 있는 패턴 단위로 보상은 피해량과 공정성을 함께 반영한다. 마지막으로 페이즈 전환은 HP 하드 게이트와 행동 지표 소프트 조건을 결합해 전투의 리듬을 지키는 방식으로 운영해야 한다.