Unreal Engine 5 Dev Log ― MCP 실험 랩 2
이 글은 MCP Lab 시리즈의 2번째 기록입니다. (총 2개)
오늘 한 일
- 배치 실험을 끝내고 게임을 만드는 쪽으로 넘어갔다. ThirdPerson 캐릭터가 이미 있으니 이동은 그대로 쓰고, 그 위에 수집 게임을 얹기로 했다.
- 블루프린트 그래프를 텍스트로 쓰는 DSL이 있는 것을 확인했다. 노드를 하나씩 만들어 핀을 잇는 대신 한 덩어리를 써 넣는 방식이다. 문법은
get_graph_dsl_docs가 준다. BP_Pickup을 만들었다. Actor를 부모로 생성하고, 구체 메시와 스피어 콜라이더를 붙이고, 메시에는 콜리전을 끄고 콜라이더만 오버랩을 잡게 했다.- 오버랩 이벤트 그래프를 DSL 한 덩어리로 써 넣고 컴파일했다.
(event Collision|EventActorBeginOverlap (OtherActor)
(Development|PrintString "Pickup!")
(Actor|DestroyActor))
- 레벨을 비우고 픽업 8개를 배치했다. 08-23에 만든 큐브 61개는 이 작업을 시작하면서 지웠다.
- 플레이 세션을 띄워 실제로 동작하는지 확인했다. 오버랩이 발동해 로그가 찍히고 픽업이 하나 사라졌다.
- 마지막으로 캐릭터 스폰 지점 둘레 반경 700에 픽업 8개를 다시 깔아, 걸어가서 먹을 수 있는 배치로 정리하고 저장했다.
막힌 부분
- 콜리전 프로파일을 직접 지정할 수 없었다.
- 해결:
collisionProfileName을 그대로 넣으면 실패하고,bodyInstance중첩으로 넣으면 통과한다. 읽을 때도 그 안에 들어 있다.
- 해결:
- 액터 라벨을 읽는 도구 이름을 짐작해서 부르면 튕긴다(08-23과 같은 함정).
- 해결: 도구든 노드든 이름은 조회해서 쓴다.
에디터 언어가 노드 타입 ID를 바꾼다
DSL 문서의 예시를 그대로 썼는데 노드를 못 찾았다. 실제 ID를 찍어보니 한글이었다.
문서 예시 Development|PrintString
실제 개발|PrintString
이벤트 이벤트추가|콜리전|이벤트ActorBeginOverlap
노드 이름이 에디터 언어를 따라간다. 문제는 DSL 쪽이다. (event X)는 AddEvent|X를 찾는데 이 접두사가 영어로 하드코딩돼 있다. 한글 레지스트리에는 이벤트추가|로 들어 있으니 X에 무엇을 넣어도 맞지 않는다. 세 가지 표기를 시험했는데 전부 같은 방식으로 실패했다.
(event 콜리전|이벤트ActorBeginOverlap) → AddEvent|콜리전|... does not exist
(event 이벤트ActorBeginOverlap) → AddEvent|이벤트... does not exist
(event 이벤트추가|콜리전|이벤트ActorBeginOverlap) → AddEvent|이벤트추가|... does not exist
- 해결: 에디터 언어를 English로 바꾸고 재시작했다. 노드 ID가 전부 영어가 되면서 DSL이 문서대로 동작했다.
- 남은 한계: 설정만 바꾸고는 안 갈린다. 노드 목록이 부팅할 때 만들어져서 재시작이 필요하다. 그리고 한글 에디터를 쓰는 동안에는 DSL로 상속 이벤트를 만들 방법이 없다.
- 트레이드오프: 영어 에디터가 MCP엔 최적이다. 다만 한글 에디터에 익숙하면 영어로 옮긴 뒤 한동안 적응 시간이 든다. 자동화에 맞춘 설정과 사람이 손으로 쓰기 편한 설정이 하나로 안 맞는 지점이다.
오버랩이 안 걸렸는데 원인은 설정이 아니라 위치였다
그래프까지 다 만들고 플레이 세션을 띄웠는데 로그가 한 줄도 안 나왔다. 콜리전 프로파일, 오버랩 이벤트 플래그, 컴포넌트 부착 상태, 이벤트 등록 여부, 컴파일 경고를 차례로 뒤졌는데 전부 정상이었다. 감지 범위를 2000으로 키워도 0건이었다.
먼저 로직이 살아 있는지부터 갈랐다. BeginPlay에 출력을 하나 심으니 픽업 8개가 전부 찍혔다. 코드는 도는데 오버랩만 안 온다는 뜻이라 후보가 줄었다.
남은 것이 위치였다. 플레이 세션 안에서 캐릭터 좌표를 직접 재보니 이랬다.
PlayerStart (0, 0, 302)
캐릭터 실제 위치 (0, 60, 92)
픽업은 PlayerStart에 맞춰 z=302 공중에 있었고, 캐릭터는 스폰 후 낙하해 z=92 바닥에 선다. 제일 가까운 픽업도 218 떨어져 있어서 반경 90으로는 닿을 수가 없었다.
- 해결: 캐릭터가 실제로 서는 좌표로 픽업을 옮기니 한 번에 발동했다. 오버랩 로그가 찍히고 플레이 월드의 픽업이 8에서 7로 줄었다.
- 남은 것: 플레이어 주변에 무언가를 놓을 때
PlayerStart좌표를 그대로 쓰면 안 된다. 스폰 후 낙하하고, 레벨에 배치된 폰이 있으면PlayerStart를 아예 쓰지 않는다.
검증 방법을 새로 짜야 했다
배치 실험은 좌표를 되읽어 계산하면 검증이 끝났다. 게임 로직은 그게 안 된다. 대신 이 순서를 썼다.
StartPIE(warmupSeconds) → GetLogEntries(LogBlueprintUserMessages) → StopPIE
로직에 PrintString을 심어 두면 로그 카테고리로 잡힌다. 그리고 플레이 세션이 도는 동안에는 액터 검색이 에디터 월드가 아니라 플레이 월드를 본다. 덕분에 픽업이 파괴됐는지 개수로도 확인된다.
- 해결: 로그와 개수 두 신호가 같이 맞아야 통과로 봤다.
다음에 할 일
- 점수를 세고 화면에 띄우기. 개수를 GameMode에 둘지 캐릭터에 둘지 정하고, UMG로 표시하는 구간이 남았다.
- 전부 모으면 클리어 처리하기.
- UE 5.6에 MCP 플러그인이 있는지 확인하고 toolset 구성을 5.8과 비교하기.
- 증분 확장 시험하기. 격자를 키울 때 기존 것을 두고 새 줄만 추가하도록 시켜본다.
- 실험 기록을 안 읽은 새 세션에서 피벗 문제를 다시 시켜보기.
MCPLab프로젝트 폴더를 git으로 추적할지 정하기. Content가 138M이라 그것만 뺄지 결정이 필요하다.