AI 기반 인게임 라이벌·보스의 플레이어 스타일 복제 시스템 기획 가이드

AI 기반 라이벌과 보스가 플레이어의 전투 습관을 분석·복제하도록 설계하는 방법을 다룬다. 행동 특징 추출, 난이도 보정, 공정성 장치, 데이터 파이프라인과 Unity 구현 예시까지 실무 관점에서 정리한다.

✓ 복사 완료!
챕터일반 가이드
난이도중급
상태● 검토 완료
대상 엔진
Unity
최종 업데이트
AI 기반 인게임 라이벌·보스의 플레이어 스타일 복제 시스템 기획 가이드

핵심 요약

AI 기반 인게임 라이벌·보스의 플레이어 스타일 복제 시스템은 플레이 기록에서 반복되는 선택을 수치화하고 그중 일부만 적 AI 행동에 반영하는 게임 디자인 장치다. 핵심은 플레이어를 완벽하게 따라 하는 적을 만드는 일이 아니라 플레이어가 자신의 습관을 알아차리고 새로운 대응법을 선택하게 만드는 데 있다. 따라서 복제율 제한, 명확한 대응 수단, 전투 구간별 난이도 보정이 반드시 함께 설계되어야 한다.

플레이어 스타일 복제형 보스는 왜 필요한가?

이 글에서는 고정 패턴의 보스에 플레이어 전투 특징을 반영하는 변주를 추가한다. 원거리 견제와 회피 점수가 높으면 거리 유지 행동의 가중치를 올리고 근접 연계 점수가 높으면 압박 콤보의 가중치를 올리는 설계안이다. 다른 보스 구현 전체를 고정 패턴으로 분류하는 것은 아니다.

이 설계안은 같은 보스의 행동 가중치를 플레이 기록에 따라 바꾸는 데 목적이 있다. 플레이어가 차이를 인지하는지, 전용 이동기나 아이템 조합을 적에게 적용해도 공정하다고 받아들이는지는 플레이 테스트에서 확인한다. 아래 표는 초기 설계 제안이며 반응을 조사한 결과는 아니다.

설계 목표권장 접근피해야 할 접근
개인화플레이 성향의 대표 행동 2~3개 반영최근 한 판의 행동을 그대로 복사
도전익숙한 습관을 한 번 견제모든 주력 행동을 동시에 카운터
공정성적 전용 텔레그래프와 빈틈 제공플레이어보다 빠른 입력·무제한 자원 부여
서사성라이벌이 관찰·학습했다는 맥락 제공설명 없이 갑자기 빌드를 복제

플레이어 행동을 분류해 보스의 공격·이동 행동에 반영하는 구상을 표현한 설명용 이미지

플레이어 스타일은 어떤 데이터로 모델링할까?

이 설계안에서는 조작 입력을 직접 재생하는 대신 행동 특징 벡터(feature vector)로 요약한다. 아래 지표의 해석은 행동 가설이며 평균 거리나 자원 잔량만으로 성향을 확정하지 않는다. 자원 최대량과 무기 범위, 전투 기간도 함께 기록한다.

수집할 행동 특징

특징측정 예시게임 디자인 의미
교전 거리피해를 준 순간의 평균 거리근접 압박형인지 원거리 견제형인지
회피 성향분당 회피 횟수, 피격 직전 회피 비율방어적 반응과 무적 회피 의존도
공격 연계평균 콤보 길이, 캔슬 사용 비율짧은 견제형인지 연계 추구형인지
자원 사용탄약·마나·스태미나의 평균 잔량절약형인지 즉시 소비형인지
회복 타이밍체력 구간별 회복 사용 비율안전 우선인지 위험 감수형인지
목표 우선순위소환물·잡몹·보스 공격 비율집중 화력형인지 전장 정리형인지

이 예제는 특징을 0~1 범위로 정규화한다. 회피 빈도 d와 기준값 d_ref는 같은 시간 단위를 쓰고 각각 유한한 d >= 0, d_ref > 0이어야 한다. 비율 지표는 분모가 0인 경우를 결측으로 분리한다. 다음 계산은 회피 성향의 확률이나 실력 점수가 아니라 정규화한 빈도다.

D=min⁡(1,ddref)D = \min\left(1, \frac{d}{d_{ref}}\right)

최근 관측에 가중치를 두는 지수이동평균(EMA)을 집계 후보로 사용한다. 초기값과 가중치에 따라 결과가 달라지며 이 식만으로 분류의 안정성을 보장하지는 않는다.

St=αXt+(1−α)St−1S_t = \alpha X_t + (1-\alpha)S_{t-1}

X_t는 이번 전투의 정규화 특징, S_t는 누적 스타일 점수이며 0 < α <= 1을 사용한다. 첫 유효 특징이나 기준 프로필로 초기화한다. α = 0.35~0.50과 0.10~0.25는 비교할 실험값이며 장르별 권장 규격은 아니다. 전투 길이가 다르면 전투별 같은 가중치가 적절한지도 확인한다.

어떤 기록을 제외해야 하는가?

튜토리얼, 강제 연출 전투, 장비 교체 직후의 시험 전투는 태그를 붙여 포함·제외 결과를 비교한다. 실패 후 반복 행동의 이유를 로그만으로 좌절이나 취향으로 단정하지 않는다. 단일 전투가 프로필에 주는 영향은 집계 가중치로 제한하는 후보안을 시험한다.

AI 기반 라이벌은 플레이 스타일을 어떻게 구현할까?

구현은 세 단계로 나누면 기획과 개발의 책임 경계가 명확해진다.

1. 플레이 로그를 전투 이벤트로 기록한다

입력 키가 아니라 의미 있는 이벤트를 저장한다. 예를 들어 DamageDealt, DodgeUsed, HealUsed, TargetChanged, SkillCast를 기록하고 각 이벤트에 시간·거리·체력 비율·자원 비율을 붙인다.

public readonly struct CombatEvent
{
    public CombatEventType Type { get; }
    public float Time { get; }
    public float DistanceToTarget { get; }
    public float HealthRatio { get; }
    public float ResourceRatio { get; }

    public CombatEvent(CombatEventType type, float time,
        float distanceToTarget, float healthRatio, float resourceRatio)
    {
        Type = type;
        Time = time;
        DistanceToTarget = distanceToTarget;
        HealthRatio = healthRatio;
        ResourceRatio = resourceRatio;
    }
}

public enum CombatEventType
{
    DamageDealt,
    DodgeUsed,
    HealUsed,
    SkillCast,
    TargetChanged
}

온라인 수집 여부, 목적, 보관 기간과 이용자 선택 정책을 정하고 적용 법령과 서비스 조건을 확인한다. 로컬 세이브의 요약 지표를 사용하는 후보안도 있지만 요약됐거나 로컬에 저장됐다는 이유만으로 익명 데이터라고 판단하지 않는다.

2. 특징 벡터를 전투 아키타입으로 분류한다

이 예제에서는 규칙 기반 분류를 기준안으로 사용한다. PlayerStyle은 프로젝트에서 정의하고 각 점수를 유한한 0~1 값으로 검증한 뒤 호출한다. 임계값은 실험값이며 여러 조건에 해당하면 코드의 첫 조건이 우선한다.

public enum CombatArchetype
{
    AggressiveMelee,
    MobileSkirmisher,
    RangedKiter,
    Balanced
}

public static CombatArchetype Classify(PlayerStyle style)
{
    if (style.CloseRangeScore > 0.65f && style.ComboScore > 0.60f)
        return CombatArchetype.AggressiveMelee;

    if (style.DodgeScore > 0.70f && style.MidRangeScore > 0.55f)
        return CombatArchetype.MobileSkirmisher;

    if (style.LongRangeScore > 0.65f && style.DistanceKeepingScore > 0.60f)
        return CombatArchetype.RangedKiter;

    return CombatArchetype.Balanced;
}

로그로 k-means 같은 군집화를 시험할 수도 있다. 특징의 스케일과 군집 수, 초기화가 결과에 영향을 주므로 집계 구간별로 비교한다. 군집이 플레이 성향의 정답 라벨이라고 가정하지 말고 행동 패키지로 해석한 결과를 검토한다.

3. 아키타입을 행동 패키지로 제한적으로 반영한다

적 AI의 기존 구조에서 행동 패키지를 연결할 지점을 정한다. 아래는 행동 점수 방식의 함수 조각이며 BossContext와 PlayerStyle을 프로젝트에서 정의한다. 체력 비율과 스타일 점수는 유한한 0~1 값으로 검증하고 사용 불가능한 행동을 선택 후보에서 제외한다.

float ScoreDashAway(BossContext ctx, PlayerStyle style)
{
    if (!ctx.DashReady) return float.NegativeInfinity; // 선택 후보에서 제외한다.
    float wantsRange = style.LongRangeScore;
    float danger = 1f - ctx.HealthRatio;

    return wantsRange * 0.55f + danger * 0.25f + 0.20f;
}

float.NegativeInfinity를 반환한 행동은 후보에서 제외하며 모든 후보가 제외되면 대기 등 실행 가능한 기본 상태로 돌아간다. style.LongRangeScore는 대시 후 사격 같은 행동의 가중치를 올릴 뿐 행동을 강제하지 않는다. 보스의 고유 패턴과 스테이지 역할을 먼저 평가한다.

flowchart LR
    A[전투 이벤트 로그] --> B[정규화 및 EMA 집계]
    B --> C[플레이 스타일 프로필]
    C --> D[전투 아키타입]
    D --> E[행동 패키지 가중치]
    E --> F[보스 Utility AI 선택]
    F --> G[전투 결과 평가]
    G --> B

플레이어 스타일 복제 보스의 난이도는 어떻게 공정하게 맞출까?

이 설계안은 복제 강도와 대응 가능성을 별도로 조정한다. 플레이어의 강점을 반영하는 행동에도 예고와 대응 수단을 두고 테스트에서 공정성 평가를 확인한다.

복제율과 대응 가능성을 분리한다

이 글의 복제율은 전체 보스 행동 중 스타일 기반 행동의 비중으로 정의한다. 대응 가능성은 예고를 인지한 뒤 피하거나 끊을 수 있는지를 뜻한다. 복제율과 텔레그래프를 각각 바꿔 실패 상황과 플레이어 평가를 비교한다.

다음 수치는 초기 실험 계획의 예시이며 플레이 테스트로 검증된 권장값은 아니다.

파라미터시험할 범위 예시목적
스타일 행동 비중전체 행동의 25~40%보스 고유성 유지
동일 행동 연속 사용 제한최대 2회단조로운 카운터 루프 방지
위험 행동 선딜0.6~1.0초반응과 학습 기회 제공
회피·방어 자원 상한플레이어 기준 70~90%적의 무한 생존 방지
실패 후 복제 강도 감소10~20%반복 실패 완화

전투 난이도 점수는 복제 강도만으로 조정하지 말고 보스 체력·피해량·행동 빈도를 분리해 관리한다.

T=whH+wdD+wfF+wcCT = w_h H + w_d D + w_f F + w_c C

H는 생존 압력, D는 피해 압력, F는 행동 빈도, C는 카운터 압력이다. 같은 점수 단위로 정규화하고 가중치를 정하는 설계용 지표이며 검증된 난이도 모델은 아니다. 실패 후 C를 줄이는 후보안을 시험하되 실패 원인과 플레이어 평가를 함께 확인한다.

보스가 절대 복제하면 안 되는 것

  • 플레이어 전용 무적 판정과 프레임 단위 캔슬
  • 과금 장비나 희귀 조합에 종속된 일회성 효과
  • 시야 밖 즉발 공격이나 입력을 읽는 수준의 완벽 반응
  • 회복 아이템을 포함한 무제한 자원 운용
  • 스토리상 보스가 알 수 없는 숨겨진 정보

플레이어가 회피 후 반격을 자주 사용했다면 보스에 짧은 회피 뒤 반격 자세를 추가하는 후보안을 시험한다. 기술 목록을 그대로 복사한 기준안과 비교해 가독성과 공정성 평가를 확인한다.

UX와 서사는 어떻게 설계해야 할까?

이 설계안에서는 다음 연출로 모방 행동을 설명한다. 플레이어가 시스템을 이해하는지는 별도로 확인하며 문구만으로 공정성 인식을 보장하지 않는다.

  • 첫 조우 전: 라이벌이 전투 기록을 관찰했다는 대사나 연출을 제공한다.
  • 전투 중: 특정 습관을 모방하는 순간에 고유 이펙트와 음성 반응을 사용한다.
  • 전투 후: “당신의 회피 후 반격을 분석했다”처럼 행동 단위의 피드백을 제공한다.
  • 재도전 시: 반복 실패하면 복제 강도가 줄었는지 알 수 있는 짧은 메시지를 제공한다.

다음 선택지를 암시하는 문장을 후보로 시험한다. 예를 들어 “거리를 내주지 않겠군”이 원거리 견제 모방과 근접 접근이라는 대응 방향을 전달하는지 플레이어에게 확인한다.

자주 묻는 질문 (FAQ)

플레이어 스타일 복제에 머신러닝이 꼭 필요한가?

필수는 아니다. 규칙 기반 특징 점수와 행동 가중치를 기준안으로 시험할 수 있다. 군집 탐색이 필요한지와 추가 모델의 평가·운영 비용을 비교한 뒤 머신러닝 도입 범위를 정한다.

보스가 플레이어 빌드를 그대로 사용해도 되는가?

핵심 기술의 인상은 차용할 수 있지만 수치와 규칙을 그대로 복사하면 안 된다. 보스는 읽을 수 있는 선딜, 제한된 자원, 명확한 빈틈을 가져야 한다.

실패한 플레이어에게도 더 강하게 복제해야 하는가?

아니다. 반복 실패는 해당 플레이 스타일이 이미 통하지 않는다는 신호일 수 있다. 실패 횟수에 따라 카운터 행동 빈도나 정확도를 낮추고 다른 대응법을 시험할 여지를 줘야 한다.

마무리

이 설계안의 목표는 플레이어가 자신의 전투 습관을 알아차리고 다른 대응을 시도하게 하는 것이다. 전투 이벤트를 특징 벡터로 요약하고 스타일 행동 비중 25~40%를 초기 후보로 시험한다. 모방 행동 인지 여부와 대응 시도, 실패 원인과 불공정하다고 평가한 상황을 기록해 목표 달성 여부를 확인한다.