내 컴퓨터에서만 보이던 몬스터 다섯: PallMark 커밋 안 된 생성 파일 107개를 분류한 날
스팀 촬영이 2·3층에서 멈췄다. 맥에서만 다시 만들어지고 커밋되지 않은 몬스터 배선 표 때문이었다. 같은 사고를 찾으려고 커밋 안 된 파일 107개를 내용 변경과 잡음으로 나눈 기록.

PallMark는 아직 개발 중인 탑 오르기 액션 게임이고, Steam 출시를 준비하고 있다. 9월 29일 오전에는 스토어용 스크린샷을 찍을 차례였다. 촬영은 Windows 작업 PC에서 최신 커밋으로 제품 빌드를 구워서 하기로 명세에 적어 두었다. 그런데 촬영이 2층과 3층에서 멈췄다. 로그에는 몬스터의 모델을 찾지 못했다는 오류가 남아 있었다. 원인은 코드가 아니라, 내 맥에만 있고 저장소에는 없던 파일 하나였다.
맥에서는 멀쩡했던 몬스터
9월 25일 커밋 035ae5d에서 특수 일반 적 다섯 종을 넣었다. 주기적으로 불 장판을 까는 불씨 요리사, 죽을 때 독구름을 남기는 독 포자, 직선으로 예고하고 쏘는 책갈피 필경사, 부채꼴로 예고하는 성광 사제, 한 번 되살아나는 해골이다. 몬스터 데이터와 규칙, 시험은 모두 이 커밋에 들어갔다. 같은 날 다섯 종의 예고와 장판이 화면에 제대로 나오는지 시각 조사 시험으로 확인했다.
빠진 것은 배선 표였다. 게임은 몬스터 ID마다 어떤 3D 모델을 쓸지 ActorViewLibrary라는 생성 자산에서 찾는다. 이 표는 사람이 고치는 파일이 아니라 Unity 셋업 단계가 데이터를 읽어 다시 만드는 파일이다. 맥에서 셋업을 돌렸을 때 다섯 종의 줄이 표에 추가됐지만, 그 결과는 커밋되지 않았다. 맥에서는 작업 트리에 새 표가 있으니 모든 것이 정상으로 보였다. 저장소를 받아 빌드한 Windows 쪽은 옛 표를 썼다.
게임 쪽 코드는 이런 경우를 조용히 넘기지 않게 만들어 두었다. 몬스터 ID가 아예 없는 상자나 문은 모델이 없는 게 정상이라 건너뛰지만, 몬스터 ID가 있는데 표에 없으면 “별칭을 굽지 않았다”는 사유로 오류를 남긴다. 덕분에 촬영 담당 작업이 어디서 왜 멈췄는지 바로 알 수 있었다.
열 줄짜리 커밋
고친 것은 표에 다섯 쌍을 더하는 일이었다. 11시 18분 커밋 e5e3a46은 추가 10줄이 전부다.
- MonsterId: mon_arena_library_bookmark_scribe
ActorKey: synty_goblin_shaman
- MonsterId: mon_arena_shrine_radiant_priest
ActorKey: arena_bishop_knight
- MonsterId: mon_arena_laboratory_poison_spore
ActorKey: arena_mushroom_angry
다섯 종 모두 새 모델이 아니라 이미 있는 모델을 빌려 쓴다. 필경사는 고블린 주술사, 성광 사제는 주교 기사, 독 포자는 화난 버섯, 불씨 요리사는 고블린, 되살아나는 해골은 노예 해골 모델이다. 표지 그림이 그 다섯 모델이다(에셋 카탈로그 촬영본이라 게임 안 색과는 다를 수 있다). 9월 25일에 넣은 몬스터가 9월 29일까지 나흘 동안 저장소 기준으로는 모델 없이 지낸 셈이다.
이런 생성 파일을 커밋하는 습관이 없었던 것은 아니다. 9월 23일에만 셋업(RunAll)이 다시 만든 파일을 모은 재생성분 커밋이 세 번 있다. 셋업을 돌리고 나면 생성 결과를 따로 모아 커밋했다. 다만 그건 빌드를 구운 날의 습관이었고, 기능 커밋에 딸린 규칙은 아니었다.
같은 사고가 더 숨어 있나
한 번 빠졌다면 다른 것도 빠졌을 수 있다. 11시 38분에 조사 작업 T1381을 명세로 적었다. 조건은 세 가지였다. Unity를 켜지 않는다, 파일을 되돌리거나 커밋하지 않는다, 맥 작업 트리에서 수정됨·미추적 상태인 파일을 전부 보고 하나씩 분류한다. 분류는 게임 동작이나 화면에 영향을 주는 “내용 변경”, 필드 순서나 직렬화 차이 같은 “잡음”, 그리고 “판단 불가” 셋이다.
수정 56개와 미추적 51개를 합친 107개를 나눴다.
Unity 씬과 프리팹은 저장할 때마다 내부 ID 숫자를 바꿔 쓰는 일이 많아서 git diff만 보면 전부 바뀐 것처럼 보인다. 그래서 큰 YAML 파일은 내부 ID 숫자를 지운 뒤 줄 묶음을 원본과 비교했다. 방 프리팹 6개, 이펙트 프리팹 6개, 씬 4개가 이 비교에서 차이 0이었다. 보고서에는 이 방법이 Unity 오브젝트 구조가 같다는 완전한 증명은 아니라는 한계도 함께 적었다.
| 찾은 것 | 개수 | 처리 |
|---|---|---|
| 구매 팩 효과음 가져오기 설정 | 28 | 바로 커밋(41d8aef) |
| 무기 드롭 변경의 시험 코드와 프로젝트 링크 | 2 | 바로 커밋(d3c1f9f) |
| 탑 씬의 미니맵·글자 크기·소리 수신기 변경 | 1 | 다음 작업에서 확인 |
| 이펙트·판정 표시 머티리얼 | 5 | 화면 비교 전에는 반영 보류 |
| 한글 글꼴 아틀라스에 추가된 26글자 | 1 | 출처 확인 필요 |
바로 커밋한 두 묶음
효과음 .meta 28개는 셋업 단계의 가져오기 규칙이 적용한 결과였다. 압축 품질이 1에서 0.5로, 모노 강제가 꺼짐에서 켜짐으로 바뀌었다. 몬스터 소리와 마법 소리 26개는 불러오는 방식도 바뀌었고, UI 넘김 소리 2개는 그대로였다. 원본 WAV와 GUID는 손대지 않았다. 이걸 커밋하지 않으면 Windows 빌드는 맥과 다른 설정으로 소리를 읽는다. 효과음을 데이터 표로 옮기며 가져오기 규칙을 만든 과정은 효과음 배선 글에 있다.
두 번째는 아예 다른 종류의 누락이었다. 같은 날 아침 커밋한 무기 드롭 보정의 반증 시험 파일 94줄과, 그 시험을 컴파일에 넣는 프로젝트 파일 한 줄이 커밋에서 빠져 있었다. 작업 보고서에는 시험 이름이 적혀 있었지만, 커밋할 파일 목록에는 없었다. 목록에서 빠진 파일은 커밋에서도 빠졌다. 둘 중 하나만 들어가면 컴파일이 깨지거나 검증이 빠지므로 한 커밋으로 묶었다. 보정 내용 자체는 50층 밸런스 글에 정리했다.
다음 작업은 확인부터
11시 53분에 쓴 다음 촬영 명세 T1382는 시작 조건을 바꿨다. 원격 저장소 기준으로 작업 트리를 맞춘 뒤, 배선 표에 필경사와 해골 줄이 실제로 있는지 먼저 확인하고 시작하게 했다. 조사에서 나온 탑 씬 변경도 이 작업으로 넘겼다. 셋업이 소리 수신기를 하나 더 붙인 것으로 보였고, 씬에 둘 이상이면 하나로 고치라고 적었다. 9월 29일 커밋 기록까지는 이 씬 변경이 아직 반영되지 않았다.
이번 일로 생성 자산을 보는 눈이 바뀌었다. 사람이 고치지 않는 파일이라도 게임이 읽는다면 결과물이다. 커밋 전 검사를 사고가 난 자리마다 하나씩 늘려 온 이야기는 커밋 전 훅 글에 있다. 촬영을 위해 만든 실행 옵션은 촬영·측정 모드 글에서 볼 수 있다. 게임 소개는 PallMark 페이지에 있다.


