며칠 전 소품을 정리하면서 구조물 겹침 검사를 만들고 이렇게 적었습니다.
여섯 맵 모두 0쌍입니다.
제보로 온 스크린샷에는 부두의 드럼통이 파란 방벽 안에 박혀 있었습니다. 검사는 여전히 0쌍이라고 답하고 있었습니다.
검사가 통과한 게 아니라, 드럼통이 검사 대상이 아니었습니다.
0.9m를 0.9m로 걸렀습니다
맵 평면도를 만들 때 "이게 엄폐물인가"를 윗면 높이로 판단합니다. 윗면이 0.9m보다 위에 있으면 엄폐물로 봅니다. 지난번에 바닥이 통째로 그려지던 문제를 고치며 넣은 기준입니다.
드럼통은 중심이 0.45m, 반높이가 0.45m입니다. 윗면이 정확히 0.9입니다.
부동소수점에서 이 값이 0.9보다 아주 조금 작게 나오면 걸러집니다. 실제로 부두의 드럼통 열두 개가 평면도에 하나도 없었습니다. 평면도 칸 수가 65개였는데, 고치니 77개가 됐습니다.
경계값을 "초과"로 잡아 두고 딱 그 경계에 놓인 물건을 만든 것입니다. 기준을 정할 때는 통과해야 하는 것 중 가장 아슬아슬한 값이 무엇인지를 같이 봤어야 했습니다.
조용히 깨진 것이 둘이었습니다
평면도에서 빠지자 두 가지가 같이 망가졌습니다.
미니맵에 드럼통이 안 떴습니다. 총알을 막는 엄폐물인데 레이더에는 없습니다. 미니맵을 믿고 판단하면 없는 줄 알았던 자리에서 총알이 멈춥니다.
겹침 검사가 드럼통을 못 봤습니다. 검사가 평면도를 재료로 쓰기 때문입니다. 통이 벽에 박혀 있어도 "0쌍"으로 보고됐습니다.
하나의 누락이 표시와 검사 양쪽에 퍼졌습니다. 미니맵을 콜라이더에서 뽑아 쓰기로 한 결정 자체는 옳았는데 — 두 벌로 두면 어긋나니까 — 그 한 벌이 틀리면 두 곳이 같이 틀린다는 대가가 딸려 있었습니다.
자가 둘이었습니다
드럼통이 왜 방벽에 박혔는지는 또 다른 문제였습니다.
드럼통 좌표는 맵 배치 코드에 (3.4, 16.5)로 적혀 있습니다. 맵을 56m로 넓히면서 1.27배로 미는 처리를 거쳐 월드에서는 (4.3, 21.0)이 됩니다. 그런데 스폰 앞 방벽은 공용 코드에 있어서 밀리지 않습니다. (4.0, 20.6) 그대로입니다.
나란히 놓으려고 적은 두 숫자가 서로 다른 자로 재졌습니다. 결과는 0.27m 관통입니다. 케이블 릴에서 한 번 겪은 것과 같은 모양의 함정이었습니다.
검사 기준도 헐거웠습니다
세 축 모두 0.6m 넘게 물려야 실패로 잡는 기준이었습니다. 지름 0.6m짜리 통에게 이건 너무 헐겁습니다. 45%가 묻혀도 통과합니다.
그렇다고 비율 기준을 전부에 적용하면 정상적인 접촉이 실패로 잡힙니다. 긴 벽이 통로 슬래브에 닿는 건 당연한 일인데, 벽 두께 대비 비율로 보면 깊이 물린 것으로 보입니다. 실제로 그렇게 고쳤다가 멀쩡한 구조가 무더기로 걸렸습니다.
그래서 통짜 소품에만 비율을 같이 봅니다. 가로 두 변이 다 1.2m 이하인 물건은 "제 몸의 40%"를 넘게 물리면 실패입니다. 긴 벽(0.8 × 8.6)이나 넓은 판(4.5 × 18)은 이 조건에 안 걸리니 예전 기준 그대로입니다.
같은 종류를 둘 더 찾았습니다
기준을 조이자 숨어 있던 것이 나왔습니다.
- 화물선: 조명 기둥이 컨테이너 안에 서 있었습니다(0.57m)
- 격납고: 지붕 기둥이 외벽 기둥과 겹쳤습니다(0.31m). 외벽 기둥이 이미 그 자리에
서 있어서 가운데 지붕 기둥을 뺐습니다. 메시도 두 개 줄었습니다
여섯 맵 전부 겹침 0쌍, 스폰 앞 막힘 0곳. 이번에는 눈으로도 확인했습니다.
남는 것
"검사가 통과했다"는 "문제가 없다"가 아닙니다. 검사가 그 대상을 실제로 보고 있는지는 따로 물어야 하는 질문이고, 저는 묻지 않았습니다.
지난 글의 "0쌍"은 그래서 틀린 문장이었습니다. 지우지 않고 그 자리에 이 글을 가리키는 표시를 붙여 뒀습니다.