라는것을 알게 되는 좋은 경험.....
요즘 (25~26년 기준) 개발판은 AI로 핫하다 못해 불타는 중이다.
그중에서도, MCP (Model Context Protocol) 라는것이 등장해서, 복잡한 프로그램을 사용하는 AI 사용자들이 신세계를 맛보고 있는데..
MCP는 뭐.. 간단히 설명하면 통신규약이고, AI 도구와 타 프로그램을 연결해주는 어쩌고...
뭐, 이걸 검색해서 본 사람들이면 나보다 더 잘 알거라 생각하고 기본적인 얘기는 생략한다.
그래서 무슨 얘기가 하고 싶은가?
Unity MCP는 비교적 빠르게 나온 반면, Unreal MCP는 좀 소식이 지지부진하다가 5.8에 들어서야 드디어 그 소식이 들리기 시작했다.
그것도 >>실험버전<< 으로.....

그리고, MCP 관련된 설명이 꽤 빈약한게, 정상적으로 MCP 를 수행시키려면 3개의 플러그인 활성화가 필요하다
첫번째는 저기에 있는"MCP Client Toolset", 두번째는 MCP 코어인 "Unreal MCP"
그리고 마지막으로... 저기에 없는 (검색에 잘 안잡히는) "Editor Toolset" 플러그인
특히 3번은... 기껏 MCP 플러그인 켜놓고 껐다 키고 실행해보면 기능 제한이 걸려서 "뭐지?" 하고 살펴봐야 알 수 있는 무언가라... 굉장히 골치가 아프다.
더 문제는, 아직 실험단계라고 그런지 토큰을 진짜 물 마시듯이 써버린다.
실제로 측정된 값을 얘기하면...
내가 사용하는 ChatGPT Plus 기준, 30%가 약 11만~17만 가량인데,
블루프린트의 특정 노드 정보 조회만 해도 2~3만 토큰을 써버린다.
진짜 별거 아닌, "이 블루프린트의 주석 좀 찾아줘" 라는 명령 하나 넣었더니 5~10%가량의 토큰을 써버리는걸 보고 와 이거 지금은 못써먹겠다... 라는 생각이 바로 들더라.
그리고 한가지 더 문제,
Unreal MCP는 5.8 이후 기능이다.
하지만 게임 엔진을 쓰는 대부분의 개발 프로젝트가 그렇듯이, 매번 최신을 따라가는 프로젝트는 없다! 라고 단언이 가능할 수준으로 실무에서는 버전 업데이트를 굉장히 보수적으로 수행한다.
그럼... 결국 Unreal MCP를 실무에서 쓸 일은 아직 한참 멀었다는 뜻.
그치만 제가 누굽니까. 언리얼 엔진 프로그래머... 일단은 말이죠.
안되면 되게하라 마인드로 작업에 착수했습니다... 만, 작업전에 검색 해보니 이미 구버전으로 포팅하려는거 자체는 많더라구요?
그래도 뭐... 최근애 새로운 작업 안해보기도 했고, 요즘 면접때 AI 활용 관련을 많이 묻는거같기도 해서 공부할 겸 작업을 진행했습니다.
1. 일단 필요한걸 수집한다
우선, Unreal MCP가 실제로 쓰는 플러그인 및 기능들을 모아봤습니다.

생각보다 많더라구요?
EditorToolSet은 UnrealMCP를 요구,
UnrealMCP는 ToolSetRegistry를 요구,
ToolSetRegistry는 >>숨겨진 플러그인<<인 FileSandbox와, Engine Sourcecode 에 박혀있는 Json Utility 신규 기능들을 요구...
그리고 JsonUtilitiesEditor는, 내부에서 "JsonSchema" 의 5.8 업데이트 버전을 요구합니다.
산넘어 산이죠.

별별 플러그인 다 봤지만 이렇게까지 종속성이 개판 오분전인건 처음보는거같아요.
아니 뭐 더 심한게 있기야 하겠지... 있겠지만...!
여튼, 필요한 리스트를 확보했으니 우선 틀을 만들어둡니다.
일단 목표는 "한개의 플러그인 그룹으로 기동하기" 니까요.
2. 하나씩 옮긴다... 어라?
그리고 이제 하나씩 옮기자니... 플러그인 단위로 옮겨야할거같은데
보시면 알겠지만 "모듈" 이 몇개 있어요.
그중에서 코어에 해당하는 "ToolsetRegistry"를 옮기자니... 이 친구의 종속성이 진짜 엄청납니다.
엔진 업데이트도 반영해야하지, 숨겨진 플러그인도 넣어야하지..
일단 냅다 넣고 보니까 5.8에 추가된 다른 기능들도 산더미지...
골치가 아프더라구요.
수정한 항목이 하도 많아서 대충 요약하면
문제 1. FSharedString::ToView() 부재
발생한 이슈 : String 전달시 StringView 를 Map에 넣은 상태로, .ToView() 함수로 전달하나, 해당 함수가 5.7.4에선 없음!
대응 방법 : *SharedString 또는 FStringView 생성으로 대응
문제 2 : FJsonObjectStructInterfaceRegistry::HasStructConverterRegistered() 신규기능 대응 불가
발생한 이슈 : 5.8의 로직에 포함되어있으나, 5.7에는 조회 API 없음. 또한 코어 기능은 Private 함수여서 엔진수정없이 접근불가
대응 방법 : 함수 조회결과, 실제 production registration도 사실상 없는것으로 보여, 해당 guard는 일단 주석처리
문제 3 : FPropertyAccessChangeNotify::ElementIndicesMap (인덱스 처리 추가 대응)
발생한 이슈 : 5.8에서 container element index notification 전달 기능이 추가되었으나, 5.7에는 관련 파이프라인 자체가 없음
대응 : 현재는 엔진버전 분기로 제외하고 known limitation으로 보류
문제 4 : UE_LOGF, UE_CLOGF 등 신규 Logging API 변화
발생한 이슈 : 5.8에서 추가된 logging API 변화로 인한 로그 처리 빌드 실패
대응 : 5.7 logging backend에 맞는 Convert 수행하여 기존 UE_LOG나 UE_CLOG 등으로 대체
문제 5 : 파일 입출력시 EPlatformFileWrite::AttemptDeleteAndCreate Enum 추가 및 분기 추가
발생 이슈 : 5.8에서 파일 입출력 관련 분기 추가 (재시도 기능 추가)
대응 : enum 자체를 추가하지 않고, MCP 내에서 delete + retry 방식으로 동작 재현
문제 6 : ISourceControlProvider interface 관련 빌드 실패
발생 이슈 : 5.8에서 일부 함수 삭제&재배치, 단 변화된 함수들에 특별한 기능이 존재하진 않음
대응 : 5.8의 UsesSoftRevertOnDelete(), 5.7 pure virtual인 IsAtLatestRevision(), GetNumLocalChanges()는 stub 추가
문제 7 : FUntilCommand 처리
발생 이슈 : 5.8에 timeout callback 없는 convenience constructor가 추가되어, 해당 로직 대응 필요
대응 : 호출 로직에서 [](){ return true; } timeout callback을 명시적으로 넣어 동일 동작 재현
문제 8 : UKismetSystemLibrary::RaiseScriptError() 함수 관련 처리
발생 이슈 : 5.8 에서 유틸리티성 API 기능 추가, 5.7 이하에서 대응함수 없음
대응 : 이미 존재하는 기존 UserRaisedError() 함수 이용, 플러그 함수 추가로 대응
굵직한건 이정도였고, 소소한 종속성 미연결로 인한 링킹 오류 같은걸 잡고 나니까...
일단 ToolsetRegistry 플러그인을 끼운채 "빌드는 됩니다" !
아직 MCP 구동은 테스트를 더 해봐야겠지만... 일단 한걸음 내딛긴 했어요.
'프로그래밍 > 기타' 카테고리의 다른 글
| 흔히 쓰는 O(n²) 정렬 (삽입,선택,버블) 요약 (0) | 2024.09.12 |
|---|---|
| 면접 대비용 자료 - C++ 기본 (0) | 2024.06.24 |
| 마인크래프트 커맨드 작업 등에 사용되는 정보 모음 (0) | 2024.05.03 |
| 필기노트 P-001 : OS 이론 2 (0) | 2021.07.20 |
| 필기노트 P-001 : OS 이론 1 (0) | 2021.07.20 |

























