Unreal Engine 5 Dev Log ― 궁 미로 PalaceMaze 3
오늘 한 일
낙선재 에셋이 부재 단위라 담장을 통째로 못 갈아끼웠던 게 지난 로그였다. 이번엔 방향을 바꿨다. 담장은 큐브에 머티리얼만 입히고, 그 위에 기와 부재를 얹고, 통로에 문 부재를 세웠다. 조립은 손으로 하나 놓고 그다음은 스크립트가 반복하는 식으로 나눴다.
- 담장 90개 전부에 전벽돌 머티리얼(
MI_BrickStone01A)을 넣었다. - 담장 위에 기와 420장. 긴 담(1600)은 8장, 짧은 담(600)은 3장이다.
- 통로 30곳에 문과 문지붕을 세웠다. 담장 반쪽 두 개가 만드는 400짜리 틈이 통로다.
- 문에 여닫이 문짝을 달았다(
BP_GateDoor). 닫히면 길이 막히고, 패드에 올라가서 E를 누르면 열린다. - 바닥 머티리얼을 기단석에서 마사토로 바꿨다.
담장 90개 긴 담 1600 × 30, 짧은 담 600 × 60
기와 420장 200 간격, z 270 고정
문 30곳 문 + 문지붕 + 문짝 두 장
액터 수 141 → 616

막힌 부분
기와가 숫자로는 붙었는데 눈에는 벌어져 있었다
기와를 200 간격으로 깔고 타일 길이가 199인 걸 감안해 scale.x를 1.005로 줘서 이음매를 맞췄다. 좌표를 되읽어 검사하니 앞 타일의 끝과 뒤 타일의 시작 사이가 −0.005였다. 붙었다고 봤다.
스크린샷을 보니 이음매마다 줄이 가 있었다.

경계상자는 맞닿았는데 실제 형상이 상자 끝까지 안 차 있었다. 용마루 부분이 안쪽으로 들어가 있다.

검사 방법을 바꿨다. 용마루 위에서 아래로 선을 쏘면 기와가 있는 자리는 270이 나오고 없는 자리는 담장 상단인 240이 나온다. 그렇게 재니 폭 2.5짜리 틈이 잡혔다. scale.x를 1.025로 올려 타일끼리 4씩 겹치게 했다. 담장 90개의 이음매 330곳에 각각 세 점씩 990점을 쏴서 확인했다.
기와 420장이 한순간에 원점으로 모였다
크기만 바꾸려고 트랜스폼 설정에 스케일 값만 넘겼다. 스키마 설명에는 “지정하지 않은 필드는 바뀌지 않는다”라고 되어 있었는데 실제로는 위치와 회전이 항등으로 초기화됐다. 420장이 전부 원점에 쌓였다.
타일 이름을 <담장이름>_r<번호>로 지어 둔 게 살렸다. 담장은 그대로 있으니 이름만 보고 위치를 다시 계산해서 전부 되돌렸다. 이후로는 트랜스폼을 쓸 때 위치·회전·스케일 셋을 항상 같이 넘긴다.
문짝 치수를 경계상자로 잡았다가 틀렸다
문짝 두 장의 경계상자를 합치니 127.3이었다. 문틀 구멍 162.5에 맞춰 늘렸는데 가운데에 틈이 생겼다.
형상을 직접 훑어 보니 실제 판재는 둘 다 59.5로 합이 119.0이었다. 게다가 한쪽 문짝에는 본체에서 떨어져 있는 얇은 문선이 따로 붙어 있었다. 최솟값과 최댓값만 보면 그 사이의 빈 구간이 통째로 안 보인다. 고체 구간을 전부 나열해야 드러난다.
블루프린트를 고쳐도 이미 깔아 둔 문 30개는 안 따라왔다
문짝 치수를 블루프린트에서 고치고 컴파일했는데 레벨의 문 30개는 옛 크기 그대로였다. 원본을 읽으면 새 값, 배치된 것을 읽으면 옛 값이 나왔다. 블루프린트 인스턴스는 배치 시점의 컴포넌트 트랜스폼을 각자 박아 둔다. 30개를 지우고 다시 깔았다.
변수는 참인데 닫는 쪽이 돌았다
E를 눌러도 문이 안 열렸다. IsOpen은 참으로 바뀌어 있는데 로그를 찍어 보니 닫는 분기가 돌고 있었다.
“현재값의 반대”를 계산해 묶어 두고, 그 값을 변수에 넣고, 그 값으로 분기하도록 짜여 있었다. 그런데 그 계산은 순수 노드라 값을 가져다 쓸 때마다 다시 계산된다. 분기가 조건을 당길 때는 이미 변수가 바뀐 뒤라 참의 반대인 거짓이 나왔다. 변수를 먼저 뒤집고 그 변수를 읽어 분기하도록 바꾸니 됐다.
그래프를 다시 써도 옛 노드가 남았다
그래프를 텍스트로 다시 쓰면 통째로 갈아끼워지는 줄 알았는데, 텍스트에 안 적은 이벤트 노드는 그대로 남는다. 임시로 넣어둔 BeginPlay 호출이 안 지워졌고, 키 입력 노드를 다시 만들었더니 두 개가 됐다. 남은 것들은 따로 지워야 했다.
문이 한 번만 부드럽게 열렸다
타임라인을 넣었는데 첫 번만 보간되고 그다음부터 순간이동했다. 타임라인 넷을 전부 Play 핀으로 시작한 게 원인이었다. Play는 재생헤드가 있는 자리에서 앞으로 가는 것이라 한 번 끝까지 가면 더 갈 데가 없다. 열기와 닫기를 다른 타임라인으로 나눠 둬서 각자 한 번씩은 동작했고, 그래서 세 번째 동작에서야 드러났다.
거기에 오른쪽 경첩 타임라인이 왼쪽 타임라인의 Update 안에서 시작되고 있었다. Update는 매 프레임 도니까 오른쪽은 매 프레임 재시작됐다.
타임라인 하나로 합쳤다. Update 하나가 두 경첩을 다 돌리고, 열 때 PlayFromStart, 닫을 때 Reverse를 쓴다. 덤으로 여는 중에 다시 누르면 그 자리에서 되돌아간다.
에디터가 한 번 죽었다
플레이 중에 액터를 찾고 컴포넌트를 훑고 로그를 읽는 작업을 한 번에 몰아 넣었다가 에디터가 내려갔다. 저장해 둔 덕에 작업물은 전부 살아남았다. 이후로는 플레이 중 검증을 화면 출력과 로그 읽기로만 했다.
담장도 돌이고 바닥도 돌이라 답답했다
담장에 전벽돌을 넣고 바닥에 기단석을 깔았더니 블록 위에 블록이었다. 궁 마당은 실제로 돌바닥이 아니라 마사토고, 기단석은 전각 밑에만 깔린다. 바닥을 흙으로 바꾸니 담장 무늬가 살아났다.
낙선재 원본 머티리얼은 건드리지 않고 /Game/PalaceMaze/에 파생 인스턴스를 만들어 썼다. 재질을 바꿀 때는 부모만 갈아끼우면 레벨의 배정과 UV 설정이 그대로 남는다.
다음에 할 일
- 문이 플레이어 쪽으로 열려서 부딪힌다. 두 경첩이 항상 같은 쪽으로 도니 절반은 문짝이 덮치는 쪽이다. 플레이어가 선 쪽을 보고 반대로 여는 게 유력한데, 여는 도중에 반대편으로 돌아가면 여전히 부딪힌다.
- 문 30개가 전부 닫힌 채로 시작하는 게 제한시간 180초와 맞는지 실제로 돌아본다.
- 전각 조립. 담장은 기와까지 끝났으니 남은 건 전각과 석물이다.
- 마패조각 퍼즐. 조각을 다 모으면 방향을 돌려 끼우는 미니게임을 만든다.
SpeedBonus적용 여부 결정. 캐릭터 블루프린트에서 직접 하거나 변수를 뺀다.- 열린 상자 비주얼 교체. 지금은 스케일로 눌러 표시하고 있다.
- 마당별 오브제 배치. 마당이 전부 똑같이 생겨서 길을 외우기 어렵다.
- 매니저의 빈 커스텀 이벤트 정리.
- 상자가 시작 지점과 겹치지 않도록 배치할 때 시작 주변을 비운다.