언리얼 페스트 서울 2026

02 · Day 1 11:30–12:20

언리얼 엔진 게임 개발의 AI 협업: NarshaADK 사례

문제는 AI의 능력이 아니라 컨텍스트다. 언리얼 로직의 절반은 바이너리 안에 있고, AI가 그것을 볼 수 있게 되면 좋은 코드를 작성한다.

#unreal-engine#ai-agent#tooling#context#game-dev

약 24분 · 6개 중 2번째

세션 개요

문제는 AI의 능력이 아니라 컨텍스트다

언리얼 로직의 절반은 바이너리 안에 있고, AI가 그것을 볼 수 있게 되면 좋은 코드를 작성합니다.

언리얼에서 AI 코딩 에이전트가 유독 잘 안 되는 이유를 네 개의 벽으로 정리하고, 그 벽을 넘기 위해 만든 하네스 플러그인 NarshaADK의 설계와 실전 결과를 공개한 세션입니다. 결론은 도구 자랑이 아니라 진단에 있습니다 — 모델이 부족한 게 아니라 모델에게 건네줄 수 있는 형태의 정보가 없다는 것입니다.

문제는 AI의 능력이 아니라 컨텍스트다. 언리얼 로직의 절반은 바이너리 안에 있고, AI가 그것을 볼 수 있게 되면 좋은 코드를 작성한다.

— 세션의 한 줄 결론

이 문서가 원본 노트에 더한 것

세션은 청중이 에이전트 도구를 이미 쓰고 있다고 전제하고 진행됐습니다. 그래서 이 문서에는 도구 프로토콜이 모델에게 실제로 무엇을 노출하는지, 왜 .uasset이 텍스트 에이전트에게 불투명한지, 언리얼의 리플렉션 메타데이터가 어떻게 스키마로 변환될 수 있는지를 공식 자료로 확인해 배경 블록으로 덧붙였습니다. 발표 내용이 아닌 부분은 블록 제목으로 구분됩니다.

진단

왜 AI는 언리얼 개발을 잘 못하는가 — 네 개의 벽

네 벽 모두 “모델이 멍청해서”가 아니라 “줄 수 있는 게 없어서” 생깁니다.

벽증상
1. 바이너리 에셋.uasset은 로우 바이트 컨텍스트만으로는 파악이 거의 불가능합니다. 특히 C++와 연계된 블루프린트의 이해도가 취약합니다.
2. 코드 할루시네이션grep 기반 탐색은 주석·문자열까지 잘못 잡습니다. 엔진과 프로젝트가 방대해 결국 훈련 지식만으로 추론하고, 존재하지 않는 함수를 만들거나 이미 있는 코드를 다시 작성합니다.
3. 엔진 동작 = 블랙박스컨피그 하나의 최종 유효 값도 여러 계층이 겹쳐 결정되므로 .ini 하나만 읽으면 실제 값과 다릅니다. 플러그인이 무슨 기능을 갖는지도 파일 몇 개로는 드러나지 않아, 이름만 보고 기능을 추측하다 틀립니다.
4. 에디터 기반 검증에디터를 켜고 PIE까지 띄워야 하므로 한 사이클이 분 단위입니다. 검증이 안 되니 다시 추론에 의존하는 악순환이 생깁니다.

기초 다지기

도구 프로토콜이 모델에게 실제로 노출하는 것

요즘의 코딩 에이전트가 외부 시스템에 손을 뻗는 표준 통로는 MCP(Model Context Protocol)입니다. 사양은 공개돼 있고, 서버가 클라이언트에게 내주는 것은 놀랄 만큼 적습니다 — tools/list에 대해 이름 · 설명 · 입력 JSON Schema가 핵심입니다(제목, 출력 스키마, 힌트 같은 선택 항목이 더 붙을 수 있습니다).

// tools/list 응답의 한 항목 — 모델이 도구에 대해 아는 정보의 핵심
{
  "name": "get_weather",
  "title": "Weather Information Provider",
  "description": "Get current weather information for a location",
  "inputSchema": {
    "type": "object",
    "properties": {
      "location": { "type": "string", "description": "City name or zip code" }
    },
    "required": ["location"]
  }
}

호출 결과도 마찬가지로 좁습니다. tools/call의 응답 콘텐츠 타입은 text · image · audio · resource_link · embedded resource뿐입니다. 즉 모델에게 무언가를 보여줄 방법은 “텍스트로 적어주기”와 “이미지로 보여주기” 둘밖에 없습니다. embedded resource에 base64 바이너리를 실을 수는 있지만, 모델이 그 바이트의 구조를 해석할 방법은 없습니다. 이것이 벽 1의 진짜 형태입니다 — 모델이 .uasset을 못 읽는다기보다, 누군가 그것을 의미 있는 텍스트로 번역해주지 않으면 전달해도 쓸 수 없습니다.

벽 1 — 바이너리 에셋이 왜 “번역 없이는 못 읽는 것”인가

.uasset은 언리얼의 직렬화 포맷입니다. 사람이 읽을 구분자가 없고, 이름은 문자열 테이블 인덱스로, 오브젝트 참조는 임포트/엑스포트 테이블 인덱스로 들어갑니다. 노드 그래프는 노드 오브젝트와 핀의 연결 관계로 저장되며, 값은 프로퍼티 태그와 함께 흘러갑니다. 구조를 아는 파서가 있어야 “무엇이 무엇에 연결됐는지”가 나옵니다.

발표에서는 일부 최신 대형 모델이 로우 바이트를 어느 정도 읽어내기도 한다고 언급했습니다.[1] 다만 그 경우에도 값 하나에는 도달해도 전체 흐름은 결국 추정에 그친다는 것이 요지였습니다.

프로젝트가 정보를 저장한 형태

텍스트 에이전트가 볼 수 있는 것

C++ 소스

.h / .cpp

그대로 읽힘

text

컴파일 산출물

.pdb

전용 리더 필요

symbol index

에셋

.uasset

파서 없으면 불가

opaque bytes

컨피그

*.ini x N

한 장만 읽으면 오답

merged at runtime

벽 3 — 컨피그 “계층”은 비유가 아니라 문서에 적힌 목록입니다

발표는 컨피그 하나의 최종 값이 약 12개 계층이 겹쳐 결정된다고 했습니다. 이건 과장이 아니라 공식 문서에 그대로 있는 숫자입니다. 에픽의 Configuration Files 문서는 한 카테고리의 로드 순서를 정확히 12단계로 명시하고, 뒤에 오는 파일이 앞의 값을 덮어쓴다고 적어둡니다.

1   Engine/Config/Base.ini
2   Engine/Config/Base<CATEGORY>.ini
3   Engine/Config/<PLATFORM>/Base<PLATFORM><CATEGORY>.ini
4   Engine/Platforms/<PLATFORM>/Config/Base<PLATFORM><CATEGORY>.ini
5   <PROJECT>/Config/Default<CATEGORY>.ini
6   Engine/Config/<PLATFORM>/<PLATFORM><CATEGORY>.ini
7   Engine/Platforms/<PLATFORM>/Config/<PLATFORM><CATEGORY>.ini
8   <PROJECT>/Config/<PLATFORM>/<PLATFORM><CATEGORY>.ini
9   <PROJECT>/Platforms/<PLATFORM>/Config/<PLATFORM><CATEGORY>.ini
10  <LOCAL_APP_DATA>/Unreal Engine/Engine/Config/User<CATEGORY>.ini
11  <MY_DOCUMENTS>/Unreal Engine/Engine/Config/User<CATEGORY>.ini
12  <PROJECT>/Config/User<CATEGORY>.ini

게다가 배열 키는 + - . ! 연산자로 계층을 넘나들며 누적·삭제됩니다. 커맨드라인 -ini: 오버라이드까지 얹히면 최종 값은 파일 어디에도 문자열로 존재하지 않습니다.

짚어둘 점

사람도 같은 함정에 빠지므로 엔진이 조회 명령을 제공합니다

이 문제는 AI 전용이 아닙니다. 그래서 엔진에는 병합된 최종 값을 직접 물어보는 콘솔 명령이 있습니다. 에이전트에게 .ini를 읽히는 대신 이 결과를 넘기는 것이 정답에 가깝습니다.

GetIni [Platform@]IniFile:Section Key

; 예: Windows 플랫폼의 Engine 계층에서 URL 섹션의 Protocol 최종 값
GetIni Windows@Engine:URL Protocol

단 이 명령은 로드된 컨피그 파일만 검색합니다. 로드되지 않은 파일에 있는 설정은 조회가 실패할 수 있습니다.

벽 4 — 루프가 안 도는 것이 가장 비싼 벽입니다

AI 코딩의 실질적 성능은 스스로 돌려보고 고치는 루프에서 나옵니다. 언리얼에서는 그 루프가 잘 돌지 않습니다. 테스트를 만들고 결과를 읽는 자동화 구조 자체도 방대해서, 제한된 컨텍스트로는 정확한 E2E 테스트 코드를 쓰기가 어렵습니다.

일반 웹·서버

편집
테스트
판정

언리얼

편집
컴파일
에디터 기동
PIE
판정

한 사이클의 상대 소요 →

검증이 안 되면 남는 건 추론입니다. 벽 4는 벽 2를 다시 키웁니다 — 실패를 확인할 수 없으니 할루시네이션이 걸러지지 않고 코드로 남습니다.

선행 시도

다들 해봤던 것들, 그리고 그 한계

시도한계
챗봇 스타일로 내용 직접 설명수작업, 확장 불가
MD·컨텍스트 파일에 BP 내용 복붙유지보수 지옥
스크린샷 여러 장 → 멀티모달 전달부정확, 토큰 폭증
극단적으로 C++만 쓰고 BP를 안 씀언리얼 워크플로 포기
에디터용 MCP로 BP 노드를 읽어 사용에디터 상시 구동 + 비용
“더 강한 최신 모델이 해결해주겠지”근본 해결 아님

특정 상황에서는 큰 도움이 됐지만, 공통적으로 시간·노력·토큰을 크게 소모했습니다.

이 소모가 쌓이면 “AI는 게임 개발에서 효용성이 떨어진다”는 결론으로 이어집니다. 발표가 인용한 현장 감각은 두 문장으로 요약됩니다 — “거의 맞지만 정확히는 아닌” 답변, 그리고 “AI가 쓴 코드를 디버깅하는 데 시간이 더 든다”.

더 깊이

스크린샷 멀티모달이 왜 특히 비싼가

MCP의 이미지 콘텐츠는 base64 인코딩된 바이트로 전달됩니다. 즉 BP 그래프 스크린샷 한 장은 “그래프 구조”가 아니라 “픽셀”로 컨텍스트를 차지하고, 노드 이름은 OCR을 거쳐야 텍스트가 됩니다. 같은 그래프를 노드·핀·연결의 구조화된 텍스트로 주면 토큰은 훨씬 적고 정확도는 훨씬 높습니다. 이 대비가 이 세션 전체의 설계 근거입니다.

근거

바이브 코딩과 에이전트 엔지니어링을 가르는 것

발표가 인용한 두 개의 외부 논지. 둘 다 출처 링크는 제시되지 않았습니다.

바이브 코딩

발표가 인용한 구분 기준

  • 생성된 결과를 그대로 받아들인다
  • 검증 절차가 사람의 눈에 의존한다
  • 모델을 바꾸는 것이 개선 수단이다

에이전트 엔지니어링

같은 구분의 반대편

  • 결과를 어떻게 검증하는지가 설계에 들어간다
  • 하네스 지침 · 도구 · MCP 오케스트레이션이 핵심 변수다
  • 모델은 교체 가능한 부품에 가깝다

발표는 이 구분을 Google 쪽 논의로 소개했습니다.[2] 요지는 둘을 가르는 기준이 AI를 쓰냐 안 쓰냐가 아니라 결과를 어떻게 검증하느냐라는 것입니다.

컨텍스트 갭 — 실패는 코드 생성이 아니라 빠진 정보에서 온다

발표는 NVIDIA 쪽 자료를 인용해 언리얼 엔진 코딩의 핵심 문제를 컨텍스트 갭으로 규정했습니다.[3] 코드를 AST 경계로 자르고 함수·시그니처·제어 흐름을 온전히 보존해 전달하면 모델이 좋은 코드를 쓴다는 관찰입니다.

AI에게 언리얼을 “읽는 법”을 장착시켜야 한다. Godot이 바이브 코딩하기 쉬운 이유도 결국 이 모든 것을 텍스트로 읽을 수 있기 때문이다.

— 세션의 정리

기초 다지기

AST 경계로 자른다는 게 무슨 뜻인가

긴 파일을 모델에게 넘길 때 가장 쉬운 방식은 줄 수나 문자 수로 자르는 것입니다. 그러면 함수 하나가 중간에서 끊기고, 시그니처와 본문이 다른 조각으로 갈라지며, 중괄호 짝이 맞지 않는 단편이 만들어집니다. AST 경계로 자르면 조각의 단위가 “문법적으로 완결된 선언”이 됩니다 — 클래스 하나, 함수 하나, 매크로가 붙은 프로퍼티 하나.

언리얼에서 이게 특히 중요한 이유는 의미가 매크로에 실려 있기 때문입니다. UPROPERTY(Replicated)가 붙었는지, UFUNCTION(BlueprintCallable)인지, DOREPLIFETIME이 어디서 등록되는지가 그 선언의 성격을 결정합니다. 텍스트 매칭은 이 표시를 그냥 문자열로 보지만, 파서는 선언에 붙은 지정자로 봅니다.

도구

NarshaADK — 세 개의 데이터 레이어를 직접 읽는 하네스

Narsha Agent Developer Kit. 클로드 코드·코덱스와 연결되는 하네스로, MCP·스킬·에이전트를 모두 포함합니다.

AI가 필요한 언리얼 데이터를 스스로 탐색하도록 돕는 플러그인입니다. 목적은 하나로 요약됩니다 — 추측이 아니라 실제 데이터를 컨텍스트로 판단하게 만드는 것.

이름은 걸그룹이 아니라 “날아오르다”에서 왔고, 반복은 AI에게 맡기고 개발자는 날아오르자는 뜻이라고 소개됐습니다.[4]

사진 · 자료

배포 페이지에 걸린 한 줄 요약

NarshaADK 플러그인 Fab 리스팅 대표 이미지
리스팅이 스스로를 정의하는 문장이 “AI가 당신의 Unreal C++와 블루프린트를 모두 이해하게 하는 첫 Agent Developer Kit”입니다. 이 문서의 사실 확인은 대부분 이 리스팅과 대조했습니다.출처: NarshaADK on Fab · 제품 리스팅 이미지 · 인용

세 개의 데이터 레이어

언리얼 프로젝트는 정보를 세 가지 포맷으로 저장하는데, 이 도구는 그 셋을 모두 직접 읽습니다. 앞의 도해에서 “전용 리더 필요 / 파서 없으면 불가”로 표시했던 두 칸을 실제로 채우는 부분입니다.

소스 코드 분석

코드 인식 파서

C++를 파서로 읽어 UPROPERTY, UFUNCTION, DOREPLIFETIME 같은 매크로를 지정자로 이해합니다 — 단순 텍스트 매칭이 아닙니다.

컴파일러 심볼 인덱스

PDB

디버거가 쓰는 것과 같은 디버그 데이터를 인덱싱합니다. 클래스 계층, 콜 그래프, 심볼 조회를 오탐 최소화로 처리합니다.

바이너리 에셋 파싱

커맨드렛·에디터 없이

.uasset을 직접 파싱합니다. BP 그래프, 머티리얼 파라미터, PCG 노드, 나이아가라 시스템까지 오프라인 접근이 가능합니다.

세 레이어가 함께 동작해야 의미가 생깁니다. “블루프린트에서 TakeDamage를 호출하는 게 누구야?” 같은 질문을 BP 노드 → C++ 함수까지 단일 쿼리로 추적하는 것이 이 조합의 목적입니다.

기초 다지기

PDB가 왜 grep보다 정확한가 — 그리고 리플렉션이 왜 별개인가

PDB는 컴파일러와 링커가 만들어낸 확정된 심볼 정보입니다. 이름 검색이 아니라 선언 위치·타입·상속 관계 같은 정보가 이미 해결된 상태로 들어 있습니다. 호출 관계는 이 정보를 바탕으로 도구가 따로 계산합니다. 그래서 “주석 속의 함수 이름”이나 “문자열 리터럴에 들어 있는 같은 단어”가 결과를 오염시키지 않습니다.

한편 언리얼에는 PDB와 별개로 자체 리플렉션 시스템이 있습니다. 에픽의 공식 설명에 따르면 이 시스템은 옵트인이며, 헤더에 매크로로 표시한 타입만 UHT(Unreal Header Tool)가 컴파일 시점에 수집합니다. UHT는 그 정보로 헤더당 .generated.h와 모듈당 생성 코드를 만들고, 지정자 키워드는 플래그 또는 메타데이터로 저장됩니다 — 런타임에 필요한 것은 플래그로, 에디터 전용은 메타데이터로 나뉘어 에디터 전용 항목은 빌드에서 제거될 수 있습니다.

// 리플렉션에 참여하는 헤더의 최소 형태
#include "MyConfigActor.generated.h"   // 반드시 마지막 include

UCLASS(config=Game)
class AMyConfigActor : public AActor
{
    GENERATED_BODY()

    UPROPERTY(Config)
    int32 MyConfigVariable;
};

이 메타데이터가 중요한 이유는 그것이 곧 스키마로 바뀔 수 있는 재료라는 점입니다. 뒤에서 볼 UE 5.8의 공식 MCP 플러그인은 정확히 이 경로를 씁니다 — 함수 시그니처와 툴팁을 리플렉션에서 읽어 JSON Schema를 자동 생성합니다.

아키텍처 — Rust 단일 바이너리

파이프라인

Rust 파서시맨틱 변환Rust 인덱스MCP 툴 계층
  • 외부 의존성이 없습니다 — 단일 Rust 바이너리이며 Python·Node.js가 불필요합니다.
  • 로컬 공유 데몬으로 구동해, 여러 터미널과 AI 클라이언트가 같은 인스턴스에 접속합니다.
  • 브라우저 로컬 대시보드가 자동 실행되어 세션, 인덱싱된 심볼, 캐시 크기, CPU 사용량을 실시간으로 보여줍니다.
  • 100% 로컬 동작. 익명 사용 리포트는 명시적 옵트인일 때만 전송되며 NARSHA_TELEMETRY_DISABLED=1로 차단합니다.
최초 인덱싱 대상소요
대부분의 프로젝트20초 이내
250GB+ AAA 프로젝트1~2분
엔진 소스·플러그인 포함추가로 2~3분
이후 세션캐시로 1초 이내 시작

인덱싱은 최초 접속 시 백그라운드로 진행됩니다.

포함 내용 — 9개 도메인 36개 툴 + 38개 워크플로 스킬

성숙도도메인내용
BetaBlueprint구조 분석, 변수·함수 편집, 실행 흐름 추적
BetaError Resolution9가지 수정 전략으로 자동 진단 + 프리플라이트 검증
BetaCode GenerationUE 베이스 클래스 파생 + 올바른 매크로·의존성
BetaGAS & Input입력 키 → GameplayAbility → 애니메이션 추적
BetaAssets머티리얼 · 나이아가라 · PCG · 컨트롤 릭 · IK 릭 · 시퀀서
BetaC++ Analysis심볼 검색, 클래스 계층, 콜 그래프, 영향도 분석
ExperimentalEditor ControlRemote Control 기반 액터 스폰 · 컴파일 · 테스트 실행
ExperimentalBuild빌드 · 쿡 · 패키징 자동화, World Partition · DDC · 소스 컨트롤
ExperimentalPerformanceUnreal Insights 프로파일링 — 병목 · 플레임그래프 · 리그레션 탐지

상당수 툴이 질의에 따라 자동으로 경로를 고르는 “smart” 오퍼레이션을 쓰므로, 오퍼레이션 이름을 외울 필요는 없다는 것이 리스팅의 설명입니다.

스킬은 툴을 엮어주는 상위 가이드입니다. 대표적인 것들만 옮기면 다음과 같습니다.

  • Unreal Error Doctor — “빌드 에러 고쳐줘” 한마디로 진단 · 설명 · 해결까지 수행합니다.
  • Blueprint Flow — BP 실행 경로를 시각화해 추적합니다.
  • Caller Graph Visualizer — “이 함수 안전하게 이름 바꿔도 돼?”에 대해 상위 호출자를 전부 추적합니다.
  • Cross-Domain Flow — 입력 키 → GA → BP → C++ → 애니메이션 전체 체인을 따라갑니다.
  • Blueprint Generator — 자연어로 BP 그래프를 만듭니다. C++가 아니라 노드 · 핀 · 연결을 생성하는 것이 요점입니다.

스킬은 플러그인에서 필요한 것만 선택해 켜고 끌 수 있습니다. 컨텍스트 예산이 한정된 에이전트에서는 이게 실질적인 성능 설정입니다.

설치와 요구사항

플러그인을 프로젝트 Plugins 폴더에 설치

프로젝트 빌드

셋업 과정에서 .mcp.json이 자동 생성됩니다.

AI 클라이언트 실행

클라이언트가 .mcp.json을 읽고 자동 연결합니다.

항목내용
엔진 버전UE 5.7 주 지원 · UE 5.6 부분 지원(완전 검증은 아님)
플랫폼Windows 64-bit
프로젝트 형태C++ 프로젝트 필수. BP 온리 프로젝트는 향후 지원 예정
검증된 클라이언트클로드 코드 · 코덱스. Cursor, Antigravity 등은 지원 작업 중
단계얼리 액세스(베타). 발표에서는 개인·인디 대상 무료 공개를 언급했습니다[5]

MCP 표준을 쓰므로 대부분의 클라이언트가 최소 설정으로 연결 가능하다는 것이 배포처의 설명입니다.

Q&A에서 정리된 버전 상황

Fab 리스팅에 5.7만 적혀 있다는 질문에 대해, 5.8 버전은 이미 만들어 내부에서 사용 중이며 업로드가 진행 중이라고 답했습니다.[6] 현재 지원 버전은 배포 페이지에서 확인하는 것이 확실합니다.

시연

실제로 무엇이 달라지는가 — 세 개의 사례

사례 1. ue_diff — 리비전 간 바이너리 에셋 비교

상황 — 특정 리비전 이후 캐릭터가 공중에 떠 있는 버그가 생겼습니다. 언제, 어디서 발생했는지 찾아야 합니다. 실제 원인은 AnimNotify 파일의 무브먼트 설정이었습니다.

이런 버그는 탐색에 오래 걸리고 실수가 잦습니다. 프로그래머 · 기획자 · 애니메이터 · VFX까지 여러 사람이 같은 AnimNotify 파일을 건드리기 때문입니다.

일반 AI 네이티브 도구

텍스트를 가정하고 만들어진 탐색

  • grep으로 열심히 찾기는 한다
  • 정확히 어디에 무슨 값이 있는지 모른다
  • 결국 에디터를 열어 사람이 확인해야 한다
  • 그 사이 AI는 추론하다 잘못된 결론에 도달한다

ue_diff

리비전 간 바이너리 에셋 직접 비교

  • “리비전 80에서는 Walking이었는데 이후 Falling으로 바뀌었다”
  • AI가 변경점의 맥락을 파악한다
  • 되돌린 뒤 검증까지 같은 흐름에서 수행한다

차이는 성능이 아니라 질문의 형태입니다 — “이 문자열이 어디 있나”에서 “이 리비전 사이에 무슨 값이 바뀌었나”로 바뀝니다.

사례 2. 구조 설명 스킬 — 플랜 모드의 컨텍스트 채우기

상황 — AI가 기존 공격 데이터를 파악하고 공격 로직을 개선해야 합니다. 세부 히트 판정을 분석하고 싶지만 코드에는 로직의 일부만 존재합니다. GA에도 있고, 몽타주와 AnimNotify에도 흩어져 있습니다. 단순 grep으로는 찾을 수 없습니다.

도해

코드에 없는 연결고리를 에디터 없이 채운다

추적 경로

어빌리티(GA)AnimNotify히트 이벤트다시 GA데미지
세 번째 칸부터가 텍스트 파일에 존재하지 않는 구간입니다. 이 구간이 비어 있으면 플랜 문서는 추정으로 채워집니다.

이후 엔진 분석까지 교차 검증해 계층 구조와 실행 흐름의 맥락을 확정하고, 정확한 계획 문서 작성으로 이어집니다.

플랜 모드는 계획을 세우기 전 코드 분석을 하는데, 이 분석이 얼마나 깊고 정확한지가 계획 문서의 품질을 결정한다.

— 플랜 모드에 대한 관찰

사례 3. 공식 언리얼 MCP와의 시너지

UE 5.8과 함께 나온 공식 언리얼 MCP와는 역할이 겹치지 않고 보완됩니다. 축이 다릅니다 — 한쪽은 분석과 추론, 다른 쪽은 에디터 제어입니다.

축NarshaADK공식 언리얼 MCP
초점분석과 추론 — 해석 및 방향성 잡기에디터 제어 — 엔진에 직접 개입
에디터 필요 여부불필요 (오프라인 파싱)필요 (에디터 프로세스 내부에서 구동)
성격읽기 중심쓰기 중심

시나리오 — 기획자가 특정 공격의 애니메이션과 연출 타이밍을 바꾸고 싶습니다. 기존에는 코드를 볼 수 없으니 매뉴얼 없이는 세팅이 어렵고, 다수의 세팅을 만지다 보면 휴먼 에러가 발생합니다.

Narsha가 어빌리티 로직과 구조를 파악

언리얼 MCP로 필요한 몽타주 교체

Narsha가 AnimNotify 시간들을 분석

단순 배열이 아니라 시간 순으로 가장 마지막에 오는 것이 무엇인지를 판단합니다.

언리얼 MCP로 세팅 적용 → 다시 읽어서 검증

PIE를 띄워 테스트 — 애니메이션 변경과 데미지 적용 확인

읽기와 쓰기를 번갈아 하는 이 패턴에서 중요한 건 4번입니다 — 쓴 다음 다시 읽어 검증합니다. 앞서 본 “결과를 어떻게 검증하느냐”가 구체적인 호출 순서로 나타난 지점입니다.

문서 정리 시점의 엔진 현황

공식 Unreal MCP는 정확히 무엇을 하는가

발표 내용이 아니라, 이 문서를 정리하며 에픽 공식 문서로 확인한 맥락입니다.

아래는 세션에서 다룬 내용이 아닙니다. 발표가 “공식 MCP는 제어, Narsha는 분석”이라는 역할 분담을 전제로 진행되므로, 그 공식 기능이 실제로 무엇이고 어디까지 하는지 확인해 덧붙였습니다.

UE 5.8 릴리스와 함께 Experimental로 들어온 플러그인입니다. 엔진 소스 트리와 콘솔 명령에서의 식별자는 ModelContextProtocol이고, 플러그인 브라우저에 보이는 친숙한 이름이 Unreal MCP입니다. 에디터 프로세스 안에 MCP 서버를 심어 로컬 HTTP로 에이전트가 에디터를 조작하게 합니다.

사진 · 자료

공식 문서가 제시하는 셋업 흐름

Unreal MCP 셋업 흐름을 요약한 공식 문서 도해
플러그인 활성화 → 오토스타트 설정 → 클라이언트 설정 파일 생성 → 프로젝트 루트에서 에이전트 실행. 앞서 본 NarshaADK 설치 절차와 마지막 두 단계가 사실상 같습니다.출처: Epic Games — Unreal MCP in Unreal Editor · © Epic Games, Inc.

툴은 플러그인 본체가 아니라 레지스트리에서 온다

중요한 구조적 사실이 하나 있습니다. Unreal MCP 자체는 툴을 하나도 구현하지 않습니다. 툴은 Toolset Registry라는 별도 서브시스템이 수집하고, AllToolsets 플러그인을 켜야 실제 툴이 등장합니다. 공식 문서는 이 점을 명시적으로 경고합니다 — 서버만 켜면 노출되는 툴이 없습니다.

플러그인 브라우저에서 Unreal MCP를 활성화하는 화면플러그인 활성화
에디터 환경설정의 Model Context Protocol 항목Auto Start Server
두 플러그인은 Toolset Registry에 의존하므로 그쪽은 자동으로 켜집니다. Auto Start를 켜면 에디터 기동 때마다 127.0.0.1:8000/mcp에 바인딩됩니다.출처: Epic Games — Unreal MCP in Unreal Editor · © Epic Games, Inc.
ModelContextProtocol.StartServer [port]      ; 서버 시작 (포트 선택)
ModelContextProtocol.StopServer              ; 서버 정지, 세션 종료
ModelContextProtocol.RefreshTools            ; 툴 제공자 재조회
ModelContextProtocol.GenerateClientConfig <Client|All>

; 지원 클라이언트 이름: ClaudeCode, Cursor, VSCode, Gemini, Codex, All
에디터 콘솔에서 GenerateClientConfig 명령을 입력한 화면콘솔 명령 입력
설정 파일이 기록됐음을 알리는 출력 로그출력 로그 확인
명령이 프로젝트 루트에 .mcp.json을 씁니다. JSON 계열 설정은 기존 항목과 병합되므로 반복 실행이 안전하지만, Codex CLI의 TOML 설정은 한 번만 쓰이고 덮어쓰지 않습니다.출처: Epic Games — Unreal MCP in Unreal Editor · © Epic Games, Inc.
// GenerateClientConfig ClaudeCode 가 프로젝트 루트에 쓰는 .mcp.json
{
  "mcpServers": {
    "unreal-mcp": {
      "type": "http",
      "url": "http://127.0.0.1:8000/mcp"
    }
  }
}

툴 작성 방식 — 시그니처가 곧 스키마다

툴셋은 UToolsetDefinition(C++) 또는 unreal.ToolsetDefinition(Python)을 상속한 클래스입니다. 두 언어 모두 1급이며, 엔진이 기본 제공하는 툴셋 상당수가 Python으로 작성돼 있습니다. 핵심은 리플렉션이 스키마를 대신 만들어준다는 점입니다.

언어노출 방법스키마 출처
Python@unreal.uclass() + @toolset_registry.tool_call이 붙은 @staticmethod타입 힌트 + Google 스타일 docstring의 Args·Returns
C++UCLASS(BlueprintType, Hidden) + UFUNCTION(meta = (AICallable)) static 함수파라미터 타입 + 함수·파라미터 문서 주석

제외하려면 Python은 데코레이터를 생략하고, C++은 meta = (AIIgnore)를 붙입니다.

더 깊이

이것이 앞의 배경 블록과 이어지는 지점

UHT가 수집하는 지정자와 메타데이터에는 툴팁, 최소·최대값 같은 항목이 이미 들어 있습니다. 공식 MCP는 그것을 JSON Schema의 description과 제약으로 옮깁니다. 즉 언리얼 프로젝트는 도구 스키마의 재료를 이미 갖고 있습니다. 벽 2(코드 할루시네이션)를 “모델을 더 크게”가 아니라 “이미 있는 메타데이터를 스키마로 노출”로 푸는 경로가 엔진 안에 열린 것입니다.

반대로 이 경로가 커버하지 못하는 곳이 남습니다 — 리플렉션에 등록되지 않은 것, 그리고 에디터가 켜져 있어야 접근 가능한 것입니다. 세션이 주장한 역할 분담의 근거가 여기에 있습니다.

Tool Search — 수백 개 툴을 컨텍스트에 밀어 넣지 않는 장치

기본값이 bEnableToolSearch = true입니다. 이 모드에서 tools/list는 모든 툴 스키마 대신 세 개의 메타 툴만 돌려줍니다.

메타 툴역할
list_toolsets사용 가능한 툴셋 이름과 설명을 반환
describe_toolset지정한 툴셋의 스키마들을 반환
call_tool이름으로 툴을 디스패치하고 같은 턴에 결과를 반환

끄면 모든 툴을 미리 광고하지만 초기 스키마 페이로드가 훨씬 커집니다. 툴 작성자는 즉시 광고를 전제하지 말라고 문서가 못 박습니다.

; 설정 섹션 (에디터 환경설정에도 같은 항목이 노출됩니다)
[/Script/ModelContextProtocolEngine.ModelContextProtocolSettings]
bEnableToolSearch=True

; 유용한 콘솔 변수
ModelContextProtocol.PaginationPageSize=0     ; 0이면 페이지네이션 없이 전부 반환
ModelContextProtocol.ProgressIntervalSeconds=1.0
ModelContextProtocol.WrapPODToolResultsInObject=True

이 설계는 이 세션의 “스킬을 필요한 것만 켠다”와 같은 문제를 다룹니다 — 컨텍스트는 유한한 예산이라는 것.

공식 문서가 스스로 적어둔 한계

  • HTTP와 Server-Sent Events만 지원합니다. stdio와 WebSocket 전송은 지원하지 않습니다.
  • 루프백 전용이며 인증 계층이 없습니다. 비루프백 Origin 헤더를 거부하고, 로컬 머신 밖으로 노출하기에 안전하지 않습니다.
  • MCP의 Resources와 Prompts는 어떤 출하 툴셋도 광고하지 않습니다.
  • 툴 호출은 게임 스레드에서 직렬로 실행되므로 클라이언트가 호출을 겹쳐 보내면 안 됩니다.
  • Live Coding은 새 UFUNCTION 선언을 전파하지 않습니다. 툴을 추가하면 에디터 재시작이 필요합니다.

마지막 항목이 벽 4와 직접 맞물립니다. 에디터 안에 사는 도구는 에디터의 수명 주기에 묶입니다. 도구를 늘리는 반복 자체가 재시작 비용을 냅니다. 반대로 오프라인 파서 쪽은 이 비용이 없습니다 — 두 접근이 왜 보완재인지에 대한 가장 구체적인 근거입니다.

비용

왜 더 싸고 빠른가

같은 질문에 답하기 위해 컨텍스트에 무엇을 싣는지가 비용을 결정합니다.

방식컨텍스트에 싣는 것비용 구조
AI 네이티브 도구바이너리 에셋을 통째로토큰 폭증. 그마저 구조로 해석되지 않습니다
에디터 기반 MCP핀별로 전체 경로를 반복누적 비용. 같은 경로가 여러 번 다시 실립니다
NarshaADK질문에 필요한 컨텍스트만토큰 · 시간 모두 절약

여기에 하나가 더 붙습니다. 에디터 없이 단독으로 바이너리 에셋을 파싱하므로, AI가 컴파일 때문에 에디터를 종료한 상태에서도 에셋 데이터에 자유롭게 접근할 수 있습니다. 분석 · 코드 생성 · 빌드 · 테스트 검증 루프를 훨씬 빠르게 돌릴 수 있다는 것이 실질적인 이득입니다.

짚어둘 점

토큰 절약은 컨텍스트 윈도의 크기 문제가 아닙니다

윈도가 커지면 해결된다고 보기 쉽지만, 실제로는 두 개의 다른 비용이 있습니다. 하나는 요금이고, 하나는 주의력입니다. 관련 없는 바이트 수만 줄에 정답 한 줄이 섞여 있으면 모델은 그 한 줄을 놓치거나 다른 줄과 섞습니다. 그래서 “필요한 것만 싣는다”는 정확도 전략이기도 합니다. 앞에서 본 공식 MCP의 Tool Search가 정확히 같은 판단입니다 — 수백 개 스키마를 미리 광고하지 않고, 필요할 때 찾아가게 만듭니다.

해법

네 개의 벽, 어떻게 넘었나

벽해결 방식
바이너리 에셋에디터를 열지 않고 내용을 확인합니다. BP · 머티리얼 · 나이아가라 · PCG · 피직스 · 애니메이션 등 도메인별 전용 도구를 두고, CDO의 실제 값과 블루프린트에서 오버라이드된 값까지 구분해 확인합니다.
코드 할루시네이션빌드가 만들어낸 심볼(PDB) 기반 컨텍스트를 씁니다. 누가 이 함수를 호출하는지, 무엇을 상속하는지 상속 체인을 한 번에 봅니다. BP ↔ C++ 양방향 확인 — “이 C++ 함수를 고치면 어떤 블루프린트가 영향받는지”.
엔진 동작언리얼을 위한 grep 대체 리드 툴. AI가 가장 익숙한 도구의 언리얼 버전으로, 소스 코드 · 바이너리 에셋 · 컨피그 · 엔진 코드를 한 번에 읽습니다.
테스트 · 검증테스트 생성 → 빌드 → 실행 → 평가를 한 흐름으로 묶습니다. 실행 흐름을 따라가고 빌드 결과를 확인하는 것까지 도구가 담당합니다.

기초 다지기

CDO와 오버라이드 값을 구분한다는 게 왜 중요한가

CDO(Class Default Object)는 클래스마다 하나씩 존재하는 기본값 보관용 인스턴스입니다. 언리얼에서 “이 프로퍼티의 기본값”은 이 오브젝트에 들어 있고, 블루프린트 클래스는 부모의 CDO를 물려받아 일부만 덮어씁니다. 여기에 인스턴스 레벨에서의 값 변경까지 얹히므로 하나의 값을 두고 최소 세 개의 층이 존재합니다.

값이 정의되는 층

텍스트로 남는가

C++ 생성자 기본값

source

남는다

.cpp

BP 클래스 오버라이드

CDO delta

남지 않는다

.uasset

레벨 인스턴스 값

per-actor

남지 않는다

.umap

그래서 C++만 읽은 AI는 늘 “기본값”으로 대답합니다. 소스에 적힌 값과 실제 런타임 값이 다르다는 것을 알 방법이 없기 때문입니다. 벽 1과 벽 2가 같은 뿌리에서 나온다는 것이 이 지점에서 드러납니다.

이 도구들은 전부 게임을 만들면서 AI가 실제로 막혔던 지점을 도구로 다시 만든 것이다. 내부 도그푸딩으로 시간과 토큰을 크게 쓰며 돌아가는 지점을 확인하고, AI가 어려워하는 부분을 파악해 툴을 개선했다.

— 도구 설계의 출발점

Before → After: 데이터를 못 읽고 · 잘못 읽고 · 너무 오래 걸렸다 → 정확한 컨텍스트를 전달해, 그럴듯하지만 존재하지 않는 코드가 아니라 실제로 존재하는 코드를 작성합니다.

배경

AI가 생성한 언리얼 C++는 정확히 어디서 깨지는가

발표가 “할루시네이션”으로 묶은 실패를, 공식 규칙에 비춰 구체적인 형태로 풀어둔 블록입니다.

이 절도 세션에서 다룬 내용이 아닙니다. 벽 2를 이해하려면 “존재하지 않는 함수를 만들어낸다” 다음 단계, 즉 문법은 맞는데 언리얼에서는 틀린 코드의 형태를 알아야 하므로 정리했습니다.

실패 형태왜 모델이 이걸 놓치는가증상
.generated.h 위치일반 C++ 습관대로 include를 알파벳 순이나 상단에 정렬합니다. 이 헤더는 반드시 마지막이어야 합니다 — UHT가 만드는 코드가 그 앞의 모든 include가 보인다고 가정합니다.컴파일 단계에서 대량의 알 수 없는 타입 오류
GENERATED_BODY() 누락클래스 본문이 문법적으로 완결돼 보이므로 빼먹어도 코드가 자연스럽습니다. 이 매크로가 StaticClass()와 썽크 함수를 주입합니다.리플렉션 등록 실패 · 링크 단계 실패
모듈 의존성헤더 이름만 알면 include는 쓸 수 있지만, 그 모듈이 Build.cs의 의존성 목록에 없으면 빌드는 통과하지 않습니다.해결되지 않는 외부 심볼
지정자 오용UPROPERTY·UFUNCTION의 지정자는 조합에 제약이 있고, 상당수는 에디터 전용 메타데이터입니다. 모델은 이름이 그럴듯한 지정자를 붙입니다.UHT 단계에서의 오류, 혹은 조용히 무시됨
기본값 가정앞 절에서 본 CDO 문제입니다. 소스의 초기값을 실제 값으로 믿고 로직을 짭니다.컴파일은 되지만 런타임 동작이 다름

공통 성질이 하나 있습니다. 다섯 가지 모두 일반 C++ 지식으로는 옳고, 언리얼의 빌드 파이프라인 규칙에서만 틀립니다. 훈련 데이터에 흔한 패턴이 오히려 오답을 만드는 구조라서, 모델 크기를 키우는 것으로는 잘 사라지지 않습니다. 이것이 발표의 “근본 해결이 아니다”라는 말의 구체적 내용입니다.

짚어둘 점

그래서 검증 루프가 있으면 대부분 걸립니다

다섯 가지 중 대부분은 빌드가 잡아줍니다(지정자 오용은 조용히 무시될 수도 있습니다). 즉 벽 2의 상당 부분은 벽 4를 풀면 함께 줄어듭니다. 발표가 툴 목록에서 Error Resolution과 Build를 나란히 둔 이유, 그리고 “테스트 생성 → 빌드 → 실행 → 평가를 한 흐름으로”를 해법으로 제시한 이유가 여기에 있습니다. 남는 하나 — 기본값 가정 — 은 빌드로 잡히지 않으므로 바이너리를 읽는 쪽에서만 해결됩니다.

적용

AX 전환 — 실제로 이렇게 일했다

제작 방식

  • 기획 · 프로그래밍 · 아트 모든 과정에서 AI와 협업했습니다.
  • 생산성이 오른 만큼 검증과 테스트에 훨씬 더 많은 시간을 쓰게 됐습니다.
  • 프로젝트뿐 아니라 프로젝트에 어울리는 하네스를 함께 만드는 데도 많은 시간을 썼습니다.
  • Narsha와 언리얼 MCP를 둘 다 적극적으로 쓰면서 사람이 할 수 있는 것을 AI도 할 수 있는지, 더 빠르게 할 수 있는지를 계속 검증했습니다.

도해

루프가 하나에서 셋으로 늘어난다

기존

개발 루프

AX 전환 이후

개발 루프 피드백 루프하네스 제작 루프
생산성 향상의 대가로 관리해야 할 루프가 늘어납니다. 뒤에서 볼 “새로운 병목”은 전부 이 두 개의 추가 루프에서 나옵니다.

성과

C++ 코드와 블루프린트의 90% 이상 — 체감상 95~99%를 AI가 작성했다. “거의 코드를 안 짜는 수준”까지 도달했다.

— 발표에서 제시된 수치

이 수치는 내부 관찰이며 외부 검증 자료는 제시되지 않았습니다.[7]

루프 엔지니어링

  • 기획에서 제작, 테스트까지 하나의 루프로 구성할 수 있습니다.
  • 루프를 잘 구성해두면 자기 전에 돌려놓고 일어나서 결과를 확인하는 게 가능합니다.
  • 목표와 기능 계획이 아주 명확하면 휴먼 아웃 오브 더 루프도 가능합니다. 물론 되는 것도 있고 안 되는 것도 있습니다.
  • AI가 노드를 추가하고 → 스스로 검증하고 → 스스로 세팅을 다시 바꿉니다. 단순 코드 생성이 아니라 검증 루프를 잘 만들면 자가 개선이 나타납니다.

비개발 직군의 변화 — 툴 제작의 민주화

리거

컨트롤 릭 자동화 설정을 스스로 제작

월드 빌더

PCG 제작 + PCG용 툴까지 직접 제작

QA

도그푸딩하며 스스로 툴 개선 — 더 이상 프로그래머에게 부탁하지 않아도 됩니다

핵심은 만든 사람과 쓰는 사람이 같아졌다는 데 있습니다. 실제로 편한 툴인지를 당사자가 직접 확인할 수 있고, 만족스러워질 때까지 직접 반복할 수 있습니다. 예전에는 프로그래머가 만들어주면 좋다·안 좋다 의견만 냈지만, 이제는 내가 진짜로 필요한 툴인지도 검증합니다.

단, 다 잘 되는 건 아니었습니다 — 많은 도메인 지식과 명확한 목표가 필요했습니다. 이 조건이 다음 절의 병목으로 이어집니다.

궤적

병목은 사라지지 않고 이동한다

발표자가 자신의 성장 단계를 순서대로 나열한 목록입니다.

챗봇 경험

바이브 코딩

클로드 코드 도입

플랜 모드

“이렇게 큰 것도 만들 수 있구나”

AI가 한 번 배신한다

검증 없는 완료는 완료가 아니다. 이 지점이 전환점입니다.

서브 에이전트 · 스킬 · 툴이 필요하다는 자각

하네스를 잘 구성해야 한다

바이브 코딩 ≠ 에이전트 엔지니어링

루프 엔지니어링

자는 동안에도 돌아가는 구조

더 많은 PC로 플릿 오케스트레이션

“사람의 이해가 병목”이라는 진단에 대해

요즘 많이 나오는 얘기는 사람의 이해가 병목이라는 것입니다. 발표자의 경험은 그 반대쪽에 있었습니다 — AI를 쓰면서 사람도 함께 성장한다는 것입니다. AI를 통해 확인하고 검증하면서 이전보다 빠르고 깊게 프로젝트를 이해할 수 있었습니다.

반대로 핵심 정보를 놓치면 프로젝트가 바로 망가지는 것도 경험했습니다. 그래서 결론은 사람의 이해와 검증, 회복까지가 하나의 루프라는 쪽입니다.

교훈

새로 생긴 네 개의 병목

코딩이 병목에서 빠지면 그 자리를 다른 것들이 채웁니다.

기초 다지기

먼저 태도에 대한 관찰 하나

발표가 가장 실용적이라고 강조한 습관은 “왜 못하지?”라고 AI와 싸우기보다 “뭐가 부족하지?”를 묻는 것입니다. 어디서 헤매는지 지켜보면 무엇을 쥐어줘야 하는지 보이고, 부족한 걸 채우면 오늘 안 되던 게 내일 가능해졌다는 것입니다. 막힌 지점 하나하나가 새로운 도구와 스킬로 태어났습니다.

병목 ① 게임 개발 이해도

  • 병목이 코딩이 아니라 게임 개발의 이해도로 넘어왔습니다.
  • 같은 도구를 줘도 사람마다 격차가 매우 컸습니다. AI가 지금 무엇을 만들고 있는지, 다음에 무엇을 만들어야 하는지에 대한 이해가 필요했습니다.
  • 도메인 지식 기반으로 AI가 잘 도는 루프를 구성하는 것 자체가 능력이었습니다.
  • 무엇을 맡기고, 무엇을 검증하게 하고, 어디서 사람이 개입할지 — 이 루프 설계가 생산성 차이로 나타났습니다.

다만 영구적 병목은 아니라고 봤습니다. 도메인 지식 자체를 AI에게 빠르게 배울 수 있기 때문에, 만들면서 배우고 배운 것을 루프로 다시 개선하면 해결해 나갈 수 있었다는 것입니다.

병목 ② 빌드와 테스트 자원

AI가 빠르게 개발해도 빌드와 테스트에 많은 시간과 비용이 듭니다. 언리얼은 더 심합니다. 그래서 테스트·검증용 PC가 계속 더 필요해집니다.

처음

1인당 1대

현재

약 2.5대

전망

3~4대

개발자 1인당 필요 PC 대수 →

이 대수는 발표자의 팀 관찰이며 외부 검증 자료는 제시되지 않았습니다.[8] 여러 PC를 오케스트레이션할 도구가 필요해, 오픈소스 도구와 전통적인 SSH, 크롬 원격 데스크톱 등을 함께 썼다고 합니다.

병목 ③ 코드 유지보수와 게임 품질

  • E2E 테스트가 잘 구성된 대형 프로젝트나, 규모가 작은 소규모 프로젝트는 유지보수가 비교적 쉽습니다.
  • 하지만 AI는 아직 프로젝트 코드의 유지보수 능력이 부족한 편입니다.
  • 그래서 프로젝트 크기와 장르에 맞는 전용 하네스를 구축하고 테스트 케이스를 잘 만들어야 합니다.
  • 생각보다 훨씬 많은 E2E 테스트가 필요했습니다 — 체감상 2~3배.[9]

병목 ④ 토큰 소모와 비용

발표는 토큰 가격이 날이 갈수록 비싸지고 있다고 진단했습니다.[10] 대부분의 모델이 충분히 똑똑한 편이므로, 각 모델의 장단점을 파악해 가성비 있는 전략을 짜는 것이 중요한 시점이라는 것입니다.

로드맵

앞으로의 방향

항목내용
검증 자동화테스트 생성부터 실행·평가까지 한 흐름으로. 사람은 기획과 메커니즘에 집중하고 검증은 AI에게 넘깁니다
UE Repeat에디터에서 한 번 작업한 것을 녹화 → 스킬화 → 값이나 일부 모듈만 바꿔 재사용. 발표는 이를 외부의 레코드 앤 리플레이 방식에 비유했습니다[11]
접근성 개선현재는 프로그래머나 이해도 높은 아티스트가 주로 사용 → 비개발자도 편하게 쓸 수 있도록
버그 수정얼리 액세스라 버그가 존재. 포럼이나 배포처 리뷰로 적극 제보 요청
UE6 대응언리얼 6 제작에 맞춰 대응 예정
Verse 연동기대가 커서 연동을 진행하고 싶다는 언급
Linux CI용 빌드요청이 많았던 항목. 리눅스 서버에서 돌려 에디터 없이 에이전트 기반 코드 리뷰
Lore 기여에픽의 새 오픈소스 버전 관리 도구. 버전 관리의 어려움이 개선되기를 기대

기초 다지기

Lore와 Verse — 로드맵의 마지막 두 항목은 무엇인가

Lore는 에픽이 2026년에 오픈소스로 공개한 버전 관리 시스템입니다. UEFN에 내장돼 있던 Unreal Revision Control이 그 출발점이고, MIT 라이선스 · Rust 구현으로 코드와 데이터 포맷·프로토콜 문서가 함께 공개됐습니다. 설계 목표에 바이너리를 1급 시민으로 다루는 콘텐츠 주소 기반 저장과 스테이징 · 커밋 · 브랜치 · diff가 네트워크 왕복을 요구하지 않는 것이 들어 있습니다. 에픽은 UE6 출시까지 내부 전환을 완료할 계획이라고 밝혔습니다.

이 성질이 ue_diff와 직접 맞물립니다. 리비전 간 바이너리 비교라는 기능은 바이너리 조각 단위의 중복 제거와 로컬 diff가 값싼 저장소 위에서 훨씬 잘 돕니다. 발표가 기여 의사를 밝힌 이유가 이 접점입니다.

Verse는 같은 자리에서 발표된 방향으로, 에픽은 게임플레이 프로그래밍 모델을 Verse로 옮기고 있으며 이를 “C++를 트랜잭션화한다”고 표현했습니다. 즉 로드맵의 두 항목은 개인 취향이 아니라 엔진 자체가 이동하는 방향을 따라간 것입니다.

Q&A

현장 질의

루프 안에서 로컬 모델도 시도해봤는지

시도했습니다. Qwen 3 계열과 27B급 모델 등을 사용해봤으나 프론티어 모델 대비 성능이 떨어진다는 답이었습니다. 결국 확률 싸움이기 때문에, 확률을 높이려면 좋은 모델이 필요하다는 것입니다.

이 답은 앞의 병목 ④와 정면으로 충돌합니다 — 비용을 줄이려면 작은 모델이 필요하고, 정확도를 높이려면 큰 모델이 필요합니다. 그래서 “모델별 장단점을 파악한 가성비 전략”이 남는 해법이 됩니다.

배포처에는 5.7만 지원한다고 되어 있던데

맞다고 답했습니다. 5.8 버전은 이미 만들어 내부에서 사용 중이며 업로드가 진행 중이고, 조만간 배포 페이지에서 확인 가능할 예정이라고 했습니다.

미결

이 세션 후에 남는 질문

발표에서 답이 나오지 않았고, 공개 자료로도 확인되지 않는 항목들입니다.

  1. 중도 도입 시나리오. ue_diff가 리비전 간 변경점 비교에 의존하는데, 프로젝트 중간에 도입하는 경우 과거 리비전에 대한 인덱싱과 비교가 가능한지가 불분명합니다.
  2. 네이밍 컨벤션 의존성. 도메인 판별을 위해 파일명 기반 분석이 들어가 있다고 언급됐습니다.[12] 즉 언리얼 컨벤션에 맞는 네이밍을 유지해야 하는데, 컨벤션이 다를 때 어떤 문제가 더 생기는지, 그리고 엔진 기본 컨벤션과 팀 자체 컨벤션 중 어느 쪽에 맞춰야 하는지는 답이 없습니다.
  3. BP 온리 프로젝트. 현재 C++ 프로젝트가 필수입니다. 향후 지원 예정이지만 시점은 공개되지 않았습니다.

두 번째 항목은 이 세션만의 문제가 아닙니다. 같은 행사 키노트의 에셋 배치 시연에서도 에셋 네이밍이 실질적 성능 변수로 등장했습니다. 이름이 유일한 의미 단서인 경로에서는 컨벤션이 곧 정확도입니다.

정리

이 세션에서 가져갈 것

진짜 주장은 “모델이 아니라 전달 형식”이다

MCP로 모델에게 보여 줄 수 있는 것은 사실상 텍스트와 이미지, 그리고 도구의 JSON Schema입니다. 바이트를 실어 보낼 수는 있어도, 바이너리에 갇힌 정보는 누군가 구조화된 텍스트로 번역하지 않으면 존재하지 않는 것과 같습니다. 벽 네 개가 전부 이 한 문장의 변형입니다.

검증 루프가 할루시네이션을 줄이는 가장 값싼 장치다

AI가 생성한 언리얼 C++의 대표적 실패 다섯 가지 중 대부분은 빌드가 잡아냅니다(지정자 오용은 조용히 무시될 수 있고, 기본값 가정은 빌드로 잡히지 않습니다). 벽 2를 줄이는 가장 확실한 방법이 벽 4를 푸는 것이라는 결론이 여기서 나옵니다. 검증 없는 완료는 완료가 아니라는 문장이 이 세션의 전환점이었던 이유이기도 합니다.

분석 도구와 제어 도구는 대체재가 아니라 보완재다

에디터 안에 사는 도구는 에디터의 수명 주기와 게임 스레드 직렬 실행에 묶이고, 새 UFUNCTION 추가에 재시작이 필요합니다. 오프라인 파서는 그 비용이 없지만 엔진에 개입할 수 없습니다. 읽기와 쓰기를 다른 도구로 나누는 것이 우회가 아니라 설계입니다.

컨텍스트 예산은 정확도 문제이기도 하다

“필요한 것만 싣는다”는 요금 절약이 아니라 오답 방지입니다. 공식 MCP가 기본값으로 세 개의 메타 툴만 광고하고 나머지는 찾아가게 만든 것, 이 세션이 스킬을 켜고 끌 수 있게 만든 것이 같은 판단입니다.

병목은 사라지지 않고 자원 쪽으로 이동한다

코딩이 병목에서 빠지자 그 자리를 게임 개발 이해도, 빌드·테스트 PC, E2E 테스트 물량, 토큰 비용이 채웠습니다. AX 전환은 개발 비용을 없애는 게 아니라 비용의 종류를 바꿉니다.

자료

참고 자료

이 문서의 사실 확인에 사용한 1차 자료와, 세션에서 언급된 후속 자료입니다.

사진 · 자료

공식 MCP의 설계 의도를 다룬 에픽 세션

Unreal Fest Chicago 2026 세션 From Words to Worlds 영상 썸네일
이 문서의 “툴 작성 방식”과 “Tool Search” 절은 이 세션과 공식 문서를 함께 대조해 정리했습니다. 리플렉션에서 JSON Schema를 자동 생성한다는 설명, UAgentSkill이 공개 Agent Skills 표준을 따른다는 설명이 여기서 나옵니다.출처: Unreal Engine 공식 유튜브 — From Words to Worlds: Integrating MCP into the Unreal Editor · © Epic Games, Inc. · 영상 썸네일

이 세션 관련

세션 페이지 · d1-t2-s1

언리얼 페스트 서울 2026 — 세션 상세

세션 목차와 권장 대상이 정리된 페이지입니다.

배포처

NarshaADK on Fab

다운로드처이자 이 문서의 대조 기준. 36개 툴 / 38개 스킬 전체 목록, 세 데이터 레이어 설명, 인덱싱 소요, 설치 요구사항, 라이선스가 여기 있습니다. 발표 시점 UE 5.7 주 지원이었고 5.8 업로드 예정이라 했으니 현재 지원 버전은 이 페이지에서 재확인하는 것이 확실합니다.

후속 확인용

에픽 라운지 — 세션 다시보기

세션 영상과 자료가 올라오는 곳입니다. 발표에서 근거로 인용된 두 개의 외부 논지는 출처 링크가 제시되지 않았으므로, 영상이 공개되면 슬라이드에서 확인하는 것이 가장 확실합니다.

피드백 창구

언리얼 엔진 코리아 유튜브 · 네이버 카페

“잘 안 되는 것을 많이 알려달라”고 명시적으로 요청됐으므로, 위 미결 항목은 이쪽이나 배포처 리뷰로 문의할 수 있습니다.

이 문서의 사실 확인에 사용한 1차 자료

프로토콜 사양

Model Context Protocol — Tools (2025-06-18)

tools/list와 tools/call의 메시지 형태, inputSchema·outputSchema, 그리고 결과 콘텐츠가 text·image·audio·resource_link·embedded resource로 제한된다는 사실.

Epic Games 공식 문서

Unreal MCP in Unreal Editor (UE 5.8)

ModelContextProtocol 식별자, AllToolsets 의존, 콘솔 명령과 설정 기본값, UToolsetDefinition 기반 툴 작성, Tool Search 메타 툴 3종, 루프백 전용·인증 없음·게임 스레드 직렬 실행·Live Coding이 새 UFUNCTION을 전파하지 않는다는 한계.

Epic Games 공식 문서

Configuration Files in Unreal Engine

카테고리별 12단계 로드 순서, 배열 연산자(+ - . !), 커맨드라인 -ini: 오버라이드, 그리고 병합된 최종 값을 조회하는 GetIni 콘솔 명령.

Epic Games 기술 블로그

Unreal Property System (Reflection)

리플렉션이 옵트인이며 UHT가 매크로 표시된 타입만 수집한다는 점, 헤더당 .generated.h 생성, 지정자가 플래그 또는 메타데이터로 저장되고 에디터 전용 메타데이터는 제거될 수 있다는 설명.

Epic Games 오픈소스

Lore — 오픈소스 버전 관리 시스템

MIT 라이선스, Rust 구현, 콘텐츠 주소 기반 저장과 조각 단위 중복 제거, 로컬 편집 작업이 네트워크 왕복을 요구하지 않는다는 설계 목표. UEFN의 Unreal Revision Control이 출발점입니다.

Epic Games 발표

State of Unreal 2026 — 주요 발표 정리

UE 5.8의 Experimental MCP 플러그인, 게임플레이 프로그래밍 모델을 Verse로 이전한다는 방향, “C++를 트랜잭션화한다”는 표현.

세션에서 추천된 도서 — 게임 디자인 병목 대응

추천 도서

The Art of Game Design — Jesse Schell

병목이 게임 디자인으로 이동한다는 진단에 대한 대응으로 제시됐습니다.

추천 도서

게임 디자인 워크숍 — Tracy Fullerton

같은 맥락에서 함께 추천된 책입니다.

부록

각주

세션이 주장했지만 공개된 1차 자료로 확정하지 못한 항목만 모았습니다. 확정된 내용은 본문에서 그대로 서술했습니다.

각주

  1. 대형 모델의 로우 바이트 판독 — 일부 최신 대형 모델이 .uasset의 로우 바이트에서 값을 읽어낸다는 관찰은 공개 벤치마크로 확인되지 않았습니다. 확인되는 것은 프로토콜 쪽 사실입니다 — MCP의 도구 결과는 텍스트·이미지·오디오·리소스 참조로 제한되므로, 바이너리를 구조로 전달하는 규정된 경로는 없습니다. ↩
  2. “바이브 코딩 ≠ 에이전트 엔지니어링” 구분 — 발표는 이 구분을 Google 쪽 논의로 소개했으나 출처 링크는 제시되지 않았고, 이 표현을 담은 특정 공개 문헌은 확인되지 않았습니다. 구분 자체의 내용(검증 방식이 기준이라는 점)은 이 문서의 다른 확인된 사실들과 모순되지 않습니다. ↩
  3. NVIDIA의 “컨텍스트 갭” 논지와 AST 경계 분할 — 발표는 2026년 3월 자료로 언급했으나 출처 링크는 제시되지 않았고, 해당 문헌은 확인되지 않았습니다. AST 경계로 코드를 분할해 시그니처와 제어 흐름을 보존하는 것이 일반적으로 유효한 기법이라는 점은 별개이며, 이 문서는 그 기법 자체만 설명했습니다. ↩
  4. 이름의 유래 — “날아오르다”에서 왔다는 설명은 발표 중의 언급이며 배포처 리스팅에는 기재되어 있지 않습니다. ↩
  5. 라이선스와 가격 — 발표에서는 개인·인디 대상 무료 공개를 언급했습니다. 다만 배포처 리스팅은 라이선스 선택과 구매 절차를 갖춘 유료 형태로 노출되며, 이 문서 작성 시점에는 무료 조건을 확인할 수 없었습니다. 실제 조건은 배포 페이지에서 확인해야 합니다. ↩
  6. UE 5.8 지원 빌드 — “이미 내부에서 사용 중이며 업로드 진행 중”은 발표 중의 답변입니다. 이 문서 작성 시점의 배포처 요구사항은 UE 5.7 주 지원 · UE 5.6 부분 지원으로 표기되어 있습니다. ↩
  7. AI 작성 비율 90% 이상(체감 95~99%) — 내부 프로젝트에 대한 자체 관찰이며, 측정 기준(줄 수 · 커밋 · 노드 수 등)과 검증 자료는 제시되지 않았습니다. ↩
  8. 개발자 1인당 PC 대수 1대 → 약 2.5대 → 3~4대 — 특정 팀의 운영 수치이며 업계 평균이나 외부 통계로 확인되지 않았습니다. ↩
  9. 필요한 E2E 테스트가 체감상 2~3배 — 자체 관찰이며 비교 기준 프로젝트나 측정 방법은 제시되지 않았습니다. ↩
  10. “토큰 가격이 날이 갈수록 비싸지고 있다” — 발표 시점의 체감이며, 실제 단가는 모델과 사업자에 따라 인상과 인하가 함께 일어나므로 단일 방향으로 확인되지 않습니다. 확인되는 것은 “같은 작업의 총비용은 컨텍스트에 무엇을 싣는지에 크게 좌우된다”는 구조적 사실입니다. ↩
  11. UE Repeat와 “레코드 앤 리플레이” — 로드맵 항목으로 언급된 기능이며, 발표가 비유로 든 외부 제품의 동명 기능은 공개 자료에서 확인되지 않았습니다. 이 문서에서는 비유 대상을 특정하지 않고 기능의 목표만 옮겼습니다. ↩
  12. 파일명 기반 도메인 판별 — 도메인 판별에 파일명 분석이 쓰이며 언리얼 네이밍 컨벤션 유지가 필요하다는 설명은 발표 중의 언급이고, 배포처 리스팅에는 기재되어 있지 않습니다. 컨벤션이 어긋날 때의 구체적 영향 범위도 공개 자료로 확인되지 않았습니다. ↩