ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VR NPC 제작 로드맵
    언리얼 개발 2026. 5. 3. 15:31

    최근 메타 퀘스트 3와 같은 독립형 VR 기기를 위한 프로젝트를 기획하면서 가장 큰 목표로 삼은 것은 '진짜 사람처럼 대화하고 행동하는 NPC'를 만드는 것입니다. 하지만 클라우드 기반의 API를 그대로 VR에 얹으려다 보니 지연 시간, API 호출 비용, 그리고 유저의 음성 데이터 프라이버시 문제라는 큰 벽에 부딪혔습니다.

    특히 퀘스트 3와 같은 모바일 칩셋 환경에서 언리얼 엔진 클라이언트가 직접 무거운 외부 AI API와 통신을 시도하면, 네트워크 변동성과 암호화 처리 부하로 인해 체감 지연 시간이 기하급수적으로 늘어납니다.

    그래서 저는 “모든 핵심 AI를 오프라인 로컬 환경으로 내리고, 언리얼 엔진은 가벼운 렌더링과 상태 제어만 담당하는 구조”를 처음부터 끝까지 직접 설계하고 구현해 보기로 했습니다. 이 글은 그 기획의 청사진이자, 앞으로 단계별로 구현해 나갈 여정의 로드맵입니다.


    전체 아키텍처 한 장으로 보기:

    이번 시스템의 핵심은 언리얼 클라이언트 ↔ WebSocket 오케스트레이터 ↔ LLM 및 TTS 도커 스택으로 이어지는 3단 분리 구조입니다.

    VR 기기 내의 언리얼 엔진은 그저 마이크로 수집한 플레이어의 음성 스트림을 WebSocket으로 쏘고, AI 서버가 결정한 행동과 음성을 받아 화면에 출력하는 가벼운 클라이언트 역할만 수행합니다.

    진짜 무거운 연산인 컨텍스트 파싱, 프롬프트 조합, 로컬 AI 모델 호출은 파이썬 기반의 오케스트레이터가 전담합니다. 이 아키텍처를 도입하면 기기가 감당해야 할 통신 오버헤드를 극적으로 줄이고, LLM 벤더가 바뀌어도 엔진 쪽 코드는 한 줄도 수정할 필요가 없는 유지보수성을 확보할 수 있습니다.

     

     


    Phase 0: 최소 기능 프로토타입

    목표: 음성 합성이나 StateTree 연동 같은 복잡한 요소는 모두 배제하고, "언리얼에서 WebSocket으로 파이썬 서버에 JSON을 보내고, 다시 JSON 응답을 받아 화면에 찍는다"는 통신 뼈대만 완성합니다.

    구현 포인트:

    • 언리얼 엔진: GameInstance나 Subsystem 레벨에 WebSocket 클라이언트 래퍼를 구현합니다. 연결 및 메시지 수신 이벤트를 바인딩하고, 키보드 입력 시 가짜 플레이어 텍스트를 JSON으로 전송합니다.
    • 오케스트레이터: websockets 라이브러리로 8765 포트를 열어 에코 서버를 구성합니다. 들어온 텍스트를 그대로 하드코딩된 JSON 형태로 반환합니다.

    왜 HTTP 폴링이 아니라 WebSocket인가? VR 환경에서 100ms의 차이는 몰입감을 완전히 깰 수 있습니다. 매번 연결을 맺고 끊는 HTTP 폴링 방식 대신, 단일한 초고속 지속 연결을 유지하는 WebSocket을 사용해야만 통신 오버헤드를 없애고 타겟 레이턴시를 방어할 수 있습니다.


    Phase 1: 월드 컨텍스트와 StateTree를 여는 순간

    목표: 단순한 텍스트 챗봇을 넘어, AI가 게임 월드의 상황을 인지하고 NPC의 행동을 지시하도록 만듭니다.

    구현 포인트:

    • JSON 스키마 설계: 언리얼 엔진은 현재 NPC의 상태, 주변 상호작용 가능 사물, 플레이어의 위치 등을 묶어 JSON으로 전송합니다.
    • 액션 플래너로서의 LLM: LLM 시스템 프롬프트에 "너는 NPC이며, 반드시 JSON으로 대사와 행동 리스트를 분리해서 답하라"고 강력한 가드레일을 설정합니다.
    • 언리얼 StateTree 연동: 서버로부터 행동 배열을 수신하면, 언리얼의 NPC 컨트롤러가 이를 파싱하여 StateTree의 블랙보드 값을 업데이트하고 행동 전환 이벤트를 트리거합니다.

    인사이트: 이 단계부터 LLM은 단순한 '대사 생성기'가 아니라 게임의 '액션 플래너'로 격상됩니다. JSON 기반 인터페이스가 확립되면 엔진 개발 팀과 AI 서버 팀이 완벽하게 병렬로 개발을 진행할 수 있습니다.


    Phase 2: 로컬 LLM 및 TTS 도커 오케스트레이션 탑재

    목표: 인터넷 연결을 완전히 끊고, 도커 컴포즈를 이용해 오프라인 모드로 돌아가는 로컬 VR NPC 스택을 완성합니다.

    구현 포인트:

    • 오디오 네이티브 LLM: 2.3B 파라미터 크기의 Gemma 4 모델을 도입할 계획입니다. 이 모델은 별도의 음성 인식 모듈을 거치지 않고 오디오 입력을 기본으로 이해하므로, 파이프라인이 획기적으로 단축됩니다. 또는 자원 효율이 극도로 높은 Qwen 3.5 모델을 vLLM으로 띄웁니다.
    • 로컬 TTS 탑재: 단 몇 초의 오디오만으로 즉각적인 화자 음성 복제가 가능하고 매우 가벼운 0.5B 크기의 오픈소스 NeuTTS Air를 컨테이너로 함께 구동합니다.
    • 통합: 오케스트레이터가 이 두 컨테이너를 조율하여 언리얼 엔진으로 최종 결과물을 스트리밍합니다.

    Phase 3: 실제 VR 환경에서 버티는 시스템으로

    목표: PC 환경이 아닌 실제 퀘스트 3와 PC VR 환경에서 플레이할 때 발생하는 네트워크 지연과 다중 NPC 관리 문제를 해결합니다.

    구현 포인트:

    • 지연 시간 예산 관리: 로컬 추론 시간이 길어질 경우를 대비해, 언리얼 엔진 쪽에 고민 중임을 나타내는 유휴 애니메이션이나 립싱크 타이밍을 미세하게 늦추는 버퍼링 로직을 추가합니다. 타임아웃 발생 시 즉각적으로 미리 준비된 폴백 대사를 출력하게 합니다.
    • 멀티 NPC 세션 분리: 여러 NPC가 동시에 말을 걸 수 있도록, WebSocket 메시지에 접속자 및 NPC 식별자를 명시하여 오케스트레이터가 각 NPC의 단기 메모리를 독립적으로 보존하도록 설계합니다.
    • VR 특화 UX: 플레이어가 NPC 근처에 다가가거나 고개를 돌려 시선을 마주칠 때만 마이크 수음과 WebSocket 통신이 활성화되도록 최적화합니다.

    인사이트: 실제 VR 유저 테스트에서 중요한 것은 토큰이 얼마나 빨리 뽑히느냐보다 지연의 패턴이 얼마나 자연스럽냐입니다. 화면 UI가 없는 VR에서는 플레이어의 시선과 거리가 가장 중요한 인터랙션 트리거가 됩니다.


    Phase 4: 디버깅 및 저작 툴링 운영 기능 확장

    목표: 프로그래머뿐만 아니라 기획자나 디자이너도 AI NPC의 성격과 행동을 쉽게 튜닝할 수 있는 AI NPC 툴킷 환경을 구축합니다.

    구현 포인트:

    • 대시보드 구축: 웹 기반 대시보드나 언리얼 에디터 유틸리티 위젯을 만들어, 최근 오고 간 WebSocket JSON 로그와 LLM 프롬프트 상태를 실시간으로 모니터링합니다.
    • 프롬프트 및 행동 템플릿 에디터: 각 NPC의 성격, 허용된 행동 리스트, 감정 값과 애니메이션 몽타주의 매핑을 비주얼 노드나 GUI로 편집할 수 있게 만듭니다.
    • 리플레이 시스템: 이전에 오고 간 오디오 및 텍스트 로그를 그대로 다시 재생하여, LLM 모델을 교체했을 때 NPC의 대답과 StateTree 행동 결과가 어떻게 달라지는지 검증하는 시뮬레이션 모드를 개발합니다.

     

Designed by Tistory.