게임에 AI가 진짜 접목되면 — 플레이어 경험은 어떻게 달라지나

게시일: 2026년 1월 13일 · 16분 읽기

지난겨울 한 인디 개발자의 데모를 본 적이 있다. 게임의 NPC가 플레이어의 행동에 자연스럽게 대응하는 것이었다. 플레이어가 마을에서 약을 훔치면, 그 사실이 NPC들 사이에 퍼진다. 그리고 며칠 뒤 마을의 분위기가 달라진다. 주민들이 더 경계하고, 일부는 플레이어와 거래를 거부한다. 지금까지 게임에서 본 "동적 반응"과는 완전히 달랐다. 정해진 대사를 읽는 게 아니라 실제로 지각 있는 존재와 상호작용하는 느낌이었다. 그게 어떻게 가능한지 물어봤고, 그 개발자가 보여준 기술이 바로 LLM 기반의 동적 스토리텔링이었다.

동적 스토리텔링의 가능성과 한계

전통적인 게임 스토리텔링은 선형 또는 분기형이다. 개발자가 가능한 모든 경로를 미리 작성한다. 플레이어의 선택지가 있지만, 그 선택지들은 미리 정의된 것이다. 분기점이 10개라면 결국 2^10 = 1024개의 가능한 경로가 있고, 개발자는 이들을 모두 고려해야 한다.

AI 기반 동적 스토리텔링은 다르다. 플레이어가 한 행동을 하면, AI가 그것을 분석해서 스토리를 "생성"한다. 이론상으로는 무한한 분기가 가능하다.

// AI 기반 동적 스토리 생성 (개념도)
class DynamicStoryEngine {
  private LLMModel storyGenerator;
  private GameState currentState;

  async Task GenerateNPCResponse(
    string npcName,
    string npcPersonality,
    string gameContext,
    string playerAction
  ) {
    string prompt = $"""
      당신은 {npcName}이라는 NPC입니다.
      성격: {npcPersonality}
      현재 상황: {gameContext}

      플레이어가 방금 이렇게 했습니다: {playerAction}

      이에 대해 자연스럽게 반응하는 대사와 행동을 생성하세요.
      응답은 한 문장의 대사와 한 문장의 행동 설명으로 이루어져야 합니다.
    """;

    // LLM에 쿼리
    string response = await storyGenerator.Generate(prompt);

    // 응답 파싱
    ParseAndExecuteResponse(response);

    return response;
  }

  async Task UpdateGameNarrative(List recentActions) {
    string narrativeContext = GenerateContextFromActions(recentActions);

    string worldUpdatePrompt = $"""
      게임 세계의 현재 상태를 고려할 때,
      다음 기간에 일어날 주요 사건을 생성하세요:
      {narrativeContext}

      사건은 플레이어의 행동 결과를 자연스럽게 반영해야 합니다.
    """;

    string newEvents = await storyGenerator.Generate(worldUpdatePrompt);
    ImplementWorldEvents(newEvents);
  }
}

이론과 실제는 다르다. 첫 번째 문제는 일관성이다. AI는 그 순간의 문맥만 고려하지, 게임의 전체 스토리 설정을 기억하지 못한다. 예를 들어 3시간 전에 플레이어가 "나는 이 세계의 선택받은 자"라고 선언했다고 치자. AI NPC는 그걸 잊을 수 있다. 100시간 뒤에 만나는 NPC는 플레이어가 얼마나 유명한지, 어떤 악행을 했는지 전혀 모를 수 있다.

이를 해결하려면 "메모리"가 필요하다. 게임의 중요한 사건들을 벡터 임베딩으로 저장하고, AI가 새로운 상황에서 관련된 기억을 검색해서 참고하는 방식이다. 하지만 이건 복잡하고 비용이 든다.

두 번째 문제는 게임 밸런스다. AI가 생성하는 스토리나 대사가 게임의 의도된 진행을 방해할 수 있다. 예를 들어 주 퀘스트를 진행하지 않고 자유롭게 행동하는 플레이어가 있다고 치자. AI가 생성하는 부수 스토리가 너무 흥미로우면, 플레이어는 주 스토리를 완전히 무시할 수 있다. 반대로 너무 심심하면 게임이 지루해진다.

AI Dungeon의 교훈

AI 기반 게임의 대표적인 예시가 AI Dungeon이다. 이 게임은 생성형 AI(GPT-3)로 텍스트 어드벤처 게임을 생성한다. 플레이어가 행동을 입력하면 AI가 그 결과를 서술한다. 이론상으로는 완벽한 자유도를 제공하는 게임이다.

하지만 실제 플레이어 반응은 복잡했다. 처음엔 신선했지만, 시간이 지나면서 문제가 드러났다. AI가 같은 상황을 반복 설명했다. 이야기의 일관성이 없었다. 갑자기 주인공의 성격이 바뀌었다. 스토리가 플레이어의 의도와 완전히 다른 방향으로 흘렀다.

개발사는 이를 개선하려고 노력했다. 플레이어가 선택할 수 있는 행동을 좀 더 제한하고, AI 생성을 제어하는 프롬프트를 더 정교하게 만들었다. 그 결과 자유도는 줄었지만, 게임으로서의 경험은 개선되었다. 역설적이지만, AI에 완전한 자유를 주는 것보다 적절한 제약을 주는 것이 더 나은 게임을 만든다.

적응형 난이도 조정의 현실

게임에 AI가 도입되면서 가장 구체적으로 개선되는 부분이 난이도 조정이다. 이건 이미 많은 게임에서 일부 구현되고 있지만, AI를 쓰면 훨씬 정교해진다.

전통적인 난이도 조정은 직설적이다. 플레이어가 쉬움, 보통, 어려움을 선택하면, 게임의 매개변수(몬스터의 HP, 공격력, 드롭 확률 등)를 변경한다. 간단하지만 부자연스럽다. 게임이 "당신이 약하니까 약해지겠다"고 명시적으로 조정하는 것처럼 느껴진다.

AI 기반 적응형 난이도는 다르다. 플레이어의 행동을 실시간으로 분석해서 암시적으로 조정한다.

// 실시간 난이도 조정 시스템
class AdaptiveDifficultyManager {
  private float playerSkillEstimate = 0.5f; // 0~1 범위
  private Queue recentActions = new Queue();

  void OnPlayerAction(PlayerAction action) {
    recentActions.Enqueue(action);

    // 최근 20개 행동으로 플레이어 스킬 평가
    if(recentActions.Count > 20) {
      recentActions.Dequeue();
    }

    float missRatio = CalculateMissRatio(recentActions);
    float dodgeSuccessRate = CalculateDodgeRate(recentActions);
    float resourceManagementQuality = EvaluateResourceUse(recentActions);

    // 여러 지표의 가중 평균으로 스킬 평가
    playerSkillEstimate =
      missRatio * 0.3f +
      dodgeSuccessRate * 0.4f +
      resourceManagementQuality * 0.3f;

    // 목표 스킬 대비 현재 스킬을 평가
    float targetDifficulty = 0.65f; // 플레이어가 약간 힘들어 하는 수준이 재미있다는 연구 결과
    float difficultyGap = playerSkillEstimate - targetDifficulty;

    if(difficultyGap > 0.15f) {
      // 플레이어가 너무 강하다
      IncreaseEnemyDifficulty();
    } else if(difficultyGap < -0.15f) {
      // 플레이어가 너무 약하다
      DecreaseEnemyDifficulty();
    }
    // 그 사이의 범위면 유지
  }

  void IncreaseEnemyDifficulty() {
    // 몬스터에게 추가 능력 부여
    enemyAI.AddBehaviorVariation();

    // 적 수 증가
    SpawnAdditionalEnemies();

    // 다음 전투 전까지의 간격 단축
    nextBattleDelay *= 0.9f;
  }

  void DecreaseEnemyDifficulty() {
    // 몬스터 기본 공격력 감소
    enemyBaseAttackMultiplier *= 0.95f;

    // 플레이어 회복 아이템 확률 증가
    itemDropRateMultiplier *= 1.05f;
  }
}

이 시스템이 작동하려면 매우 신중한 조정이 필요하다. 플레이어는 난이도가 변하는 걸 느껴서는 안 된다. 만약 명시적으로 "우리가 당신을 도와주고 있다"는 느낌이 들면, 게임의 성취감이 무너진다. "이건 제 능력 때문이 아니라 게임이 쉬워진 거네"라고 생각하게 되기 때문이다.

또 다른 문제는 플레이어가 "도움을 받고 있다"는 걸 간파하는 경우다. 특히 경험이 많은 게이머는 게임이 자신의 행동에 반응하는 패턴을 알아챌 수 있다. 그러면 게임이 "가짜"라고 느끼게 된다.

실제로 성공하는 게임들은 난이도 조정을 매우 섬세하게 한다. 예를 들어 어떤 게임은 플레이어가 같은 보스전에서 여러 번 죽으면, 그 보스에게만 HP를 10% 낮춰준다. 눈에 띄지 않을 정도의 변화다. 또 다른 게임은 플레이어의 무기 강화 확률을 살짝 올려준다. 게임이 친절해진 것처럼 느껴지지만, 명시적인 난이도 조정처럼 느껴지지 않는다.

Nvidia ACE의 시도

Nvidia가 최근 발표한 ACE(Artificial Intelligence for Characters Engine)는 게임 NPC에 AI를 통합하는 플랫폼이다. 기본 개념은 이렇다: NPC가 음성으로 플레이어와 대화하고, 그 대화가 자연스럽게 들린다. 미리 녹음된 대사가 아니라 실시간으로 생성되는 대사다.

플레이어가 "저 상인에게 가격을 깎아달라고 해야 할까?"라고 생각하고 대화를 시작하면, ACE는 상인의 성격과 현재 상황을 고려해서 그에 맞는 대사를 생성한다. 만약 플레이어가 상인의 취향(예: 용병질, 수집품 선호)을 알면, 그걸 활용해서 더 효과적으로 협상할 수 있다.

이건 게임플레이에 새로운 차원을 추가한다. 기존 게임에서는 플레이어가 할 수 있는 말이 미리 정해져 있다. 선택지가 3-4개다. 하지만 ACE를 쓰면 플레이어가 원하는 대로 말할 수 있다. 그러면 게임이 훨씬 더 "살아있는" 느낌이 된다.

하지만 여기도 한계가 있다. 첫째, 성능 비용이 크다. 매번 NPC의 대사를 생성하려면 상당한 계산이 필요하다. 온라인 게임이라면 서버 비용이 급증한다. 둘째, 실시간 음성 생성 품질이 아직 완벽하지 않다. 부자연스러운 발음, 감정 없는 톤, 이상한 강세가 있을 수 있다. 셋째, 콘텐츠 제어가 어렵다. NPC가 예상 밖의 대사를 할 수 있다. 게임의 세계관과 맞지 않거나, 부적절한 내용일 수 있다.

절차적 퀘스트와 스토리의 경계

게임에 AI가 잘 접목되는 부분 중 하나가 퀘스트 생성이다. 특히 부수 퀘스트(side quest)는 AI가 생성하기 좋은 콘텐츠다. 핵심 스토리에 영향을 주지 않기 때문이다.

예를 들어 플레이어가 마을에 도착했다고 치자. AI는 다음을 생각한다. "이 마을에 어떤 주민들이 있나? 그들이 현재 어떤 문제를 가지고 있나? 플레이어는 이런 스킬을 가지고 있으니, 이 퀘스트를 할 수 있을까?" 그리고 동적으로 퀘스트를 생성한다.

// 절차적 퀘스트 생성
class QuestGenerator {
  async Task GenerateQuestForPlayer(
    Village village,
    Player player,
    NPC questGiver
  ) {
    // 마을의 현재 상황 분석
    string villageContext = AnalyzeVillageState(village);

    // NPC의 성격과 상황 분석
    string npcContext = $"""
      이름: {questGiver.Name}
      성격: {questGiver.Personality}
      직업: {questGiver.Profession}
      현재 문제: {questGiver.CurrentProblem}
    """;

    // 플레이어의 능력 파악
    string playerContext = $"""
      레벨: {player.Level}
      스킬: {string.Join(", ", player.Skills)}
      아이템: {string.Join(", ", player.Equipment)}
      이전 완료한 퀘스트: {string.Join(", ", player.CompletedQuests)}
    """;

    // AI로 퀘스트 생성
    string questPrompt = $"""
      {npcContext}라는 NPC가 {playerContext}인 플레이어를 도와달라고 한다.
      {villageContext}를 고려할 때, 자연스럽고 도전적인 부수 퀘스트를 생성하세요.

      퀘스트는 다음 형식으로:
      제목: [한 줄]
      설명: [2-3줄]
      목표: [명확한 목표]
      보상: [플레이어 레벨에 맞는 보상]
    """;

    string questData = await aiGenerator.Generate(questPrompt);
    return ParseQuestFromAI(questData, questGiver);
  }
}

이 방식은 게임의 반복성을 줄인다. 플레이어가 100시간을 플레이해도 계속 새로운 퀘스트를 받을 수 있다. 하지만 문제가 있다.

첫째, 퀘스트의 평균 품질이 떨어질 수 있다. 손으로 만든 퀘스트는 개발자가 여러 번 테스트하고 이야기를 다듬는다. 하지만 AI가 생성하는 퀘스트는 한 번에 나온다. 부자연스럽거나 논리적 모순이 있을 수 있다.

둘째, 퀘스트가 게임의 세계관을 벗어날 수 있다. AI는 게임의 설정을 완벽히 이해하지 못한다. 예를 들어 "마법사의 마을"이라는 배경이 있는데, AI가 과학기술 기반의 퀘스트를 생성할 수 있다.

셋째, 플레이어가 같은 종류의 퀘스트를 반복 받을 수 있다. AI가 이전에 생성한 퀘스트를 기억하지 못하고, 다양성을 보장할 메커니즘이 없으면 계속 비슷한 퀘스트를 반복 생성한다.

게임의 "감정" 표현과 AI의 한계

게임이 단순히 물리 엔진이나 수치 계산이라면, AI가 완벽하게 대체할 수 있다. 하지만 게임의 가장 중요한 부분은 "감정"이다. 플레이어가 느끼는 희열, 긴장감, 슬픔, 분노. 이걸 주도하는 건 스토리와 연기다.

AI는 이 부분에서 여전히 약하다. AI가 생성하는 대사는 기술적으로 정확할 수 있지만, 그 안에 감정이 느껴지지 않는다. 예를 들어 NPC가 "내 아버지를 죽인 자를 찾아달라"고 말할 때, 손으로 연기하는 배우는 목소리의 음정, 속도, 강약으로 슬픔을 표현한다. 하지만 AI가 생성한 대사는 감정 없이 들린다.

이를 개선하려면 음성 생성 AI가 감정을 포함해야 한다. 그리고 개발팀이 각 NPC의 감정 상태를 AI에게 명시해야 한다. 하지만 이건 복잡하고, 결국 손으로 만드는 것보다 더 복잡할 수 있다.

게임의 진정한 영향력은 기술이 아니라 감정에서 나온다. AI는 기술은 제공할 수 있지만, 감정은 여전히 사람의 몫이다.

실제 게임에서 보이는 변화

이론만 얘기하는 것보다 실제 게임의 예시가 도움이 된다. 최근 출시된 게임들 중 AI를 의미 있게 활용한 사례들을 보자.

한 게임은 플레이어의 플레이 시간에 따라 던전의 난이도를 자동으로 조정한다. 새로운 플레이어는 쉬운 배치를 만나고, 경험 많은 플레이어는 어려운 배치를 만난다. 눈에 띄지 않게, 자연스럽게.

또 다른 게임은 NPC들이 플레이어의 이전 행동을 "기억"한다. 도둑질을 한 번 했으면, 그 사실이 마을에 퍼진다. 상인들이 더 비싼 가격을 부르기 시작한다. 이건 AI가 게임 세계의 "소문" 시스템을 관리하는 방식이다.

세 번째 게임은 플레이어의 행동 패턴을 분석해서 특정 콘텐츠를 추천한다. 플레이어가 전투를 주로 한다면 던전을 추천하고, 탐사를 선호한다면 신비로운 영역을 추천한다. 이건 단순하지만 개인화된 게임 경험을 만든다.

앞으로의 방향

지금까지의 AI 게임 통합은 "보조"와 "자동화" 수준이다. 하지만 앞으로는 더 깊어질 것 같다. AI가 단순히 대사를 생성하거나 퀘스트를 만드는 게 아니라, 게임 세계의 "마스터드라마터" 역할을 하게 될 것이다. 플레이어의 모든 행동을 추적하고, 게임 세계의 상태를 업데이트하고, 다음에 무엇이 일어날지 동적으로 결정한다.

하지만 그럴 때도 한 가지는 변하지 않을 것이다. 게임의 핵심은 여전히 "플레이어의 선택이 의미 있다"는 느낌이다. AI가 아무리 똑똑해도, 플레이어가 "이건 그냥 알고리즘이 뱉는 거겠지"라고 생각하면 게임은 죽는다. 그래서 진짜 챌린지는 기술이 아니라 디자인이다. 플레이어가 의미 있는 선택을 하고 있다고 느끼면서도, 그 선택이 실제로 게임 세계에 영향을 주는 경험을 만드는 것. 그게 AI 시대의 게임 개발자가 해야 할 일이다.

iL
ian.lab

실무 개발자입니다. 현장에서 겪은 문제와 해결 과정을 기록합니다. 오류 제보는 연락처로 보내주세요.