#11을 올린 직후에 두 가지 제보를 받았습니다. "몬스터 얼굴이 아직도 캐릭터를 통과한다", "성벽을 뚫고 지나가는 버그도 있다". 고치러 들어갔다가 결국 눈대중으로 정해둔 숫자를 전부 다시 재는 하루가 됐습니다. 오늘의 기록은 그 이야기입니다.
성벽은 한 칸이 5.2u 폭인데, 충돌 판정은 반지름 2.6짜리 원으로 넣어두고 있었습니다. 조각을 5.2 간격으로 세웠으니 원도 딱 맞겠거니 했던 겁니다.
그런데 종이에 그려보면 금방 보입니다. 반지름 2.6짜리 원 두 개를 5.2 간격으로 놓으면 한 점에서만 접합니다. 접점 주변은 양쪽 원 어디에도 속하지 않는 빈 공간입니다. 즉 이음매마다 사실상 구멍이 뚫려 있었고, 비스듬히 들어가면 그대로 빠져나갔습니다.
길게 이어지는 것은 원으로 근사하면 안 된다는, 알고 보면 당연한 이야기였습니다. 사각형 띠 장애물을 새로 만들어 성벽을 통짜로 막았습니다. 밀어내기는 덜 파고든 축으로 하도록 했는데, 이렇게 하면 얇은 벽에서는 언제나 두께 방향으로 튕겨 나갑니다.
요괴 머리가 캐릭터를 관통하던 문제는 사실 지난달에 한 번 고쳤습니다. 유지 거리를 1.1에서 1.75로 올렸었죠. 그런데 여전히 남아 있었습니다.
이유는 그 검사가 요괴 쪽 코드에만 있었기 때문입니다. 요괴가 플레이어에게 다가올 때는 1.75에서 멈추지만,
그래서 매 프레임 요괴를 사람 몸 밖으로 되미는 처리를 넣었습니다. 순서가 중요했습니다 — 요괴끼리 민 뒤에 실행해야 밀려 들어온 놈까지 정리됩니다. 그리고 미는 쪽은 언제나 요괴입니다. 플레이어를 밀면 조작감이 망가지니까요.
요괴 몸통 한가운데(거리 0.2)로 순간이동시켜 봤더니 다음 프레임에 정확히 1.75로 밀려났습니다.
여기까지 고치고 나니 "건물이 좀 더 컸으면 좋겠다, 너무 작은 듯하다"는 말씀을 들었습니다.
배율은 그동안 화면을 보면서 눈대중으로 정한 값이었습니다. 이번엔 재보기로 했습니다. 브라우저에서 각 모델의 바운딩 박스를 훑어 높이를 뽑고, 캐릭터 키와 나란히 놓아봤습니다.
캐릭터는 2.12u였습니다. 그리고,
제보가 정확했습니다. 눈대중이 틀렸던 게 아니라, 애초에 기준이 없었던 겁니다.
그래서 "사람의 몇 배로 보여야 하는가"를 먼저 정하고 거기서 배율을 역산했습니다.
| 대상 | 예전 | 지금 | 사람 대비 |
|---|---|---|---|
| 망루 | 4.35u | 7.9u | 3.7배 |
| 방앗간 | 4.36u | 7.3u | 3.5배 |
| 성벽·성문 | 3.0u | 5.3u | 2.5배 |
| 병영 | 2.6u | 4.9u | 2.3배 |
| 노점 | 2.07u | 2.6u | 1.2배 |
| 오두막 / 성채 | 2.0 / 4.0u | 4.2 / 8.5u | 2배 / 4배 |
성벽 앞에 서니 그제야 성벽처럼 보였습니다.
큰 변경은 늘 옆구리를 건드립니다.
노점 차양이 카메라를 삼켰습니다. 노점을 3.3u까지 키웠더니 화면이 지붕으로 꽉 찼습니다. 카메라 높이가 2.8u인데 차양이 그보다 높아진 겁니다. 하필 상점은 가까이 가야 열리는 구조라 플레이어가 노점에 바짝 붙습니다. 2.6u로 되돌렸습니다. 멀리서 보는 망루·방앗간에는 없는 문제라 그쪽은 크게 뒀습니다. "플레이어가 바짝 붙는 물건은 카메라보다 낮아야 한다" — 새로 알게 된 규칙입니다.
덤불이 성벽을 뚫고 자랐습니다. 소품이 건물 자리를 피하도록 하는 반경이 있는데, 성벽은 충돌이 사각형이라 그 반경 값을 갖고 있지 않아 기본값이 쓰이고 있었습니다. 벽은 넓어졌는데 비우는 자리는 그대로였던 셈입니다.
여기서 하나 더 나왔습니다.
성벽에 성문 자리를 비워두는데, 그 폭을 문 조각의 폭(±4.6) 으로 잡고 있었습니다. 그런데 문 조각은 대부분이 돌벽이고 가운데에 아치 구멍이 뚫려 있을 뿐입니다.
정확히 알고 싶어서 광선을 쐈습니다. 문 모델의 삼각형을 전부 꺼내서, 사람 키 높이 여러 지점에 광선을 통과시켜 어디가 뚫려 있는지 재봤습니다.
결과는 ±0.6이었습니다. 그 위로는 아치가 좁아져 2.1u 높이에서는 ±0.3까지 줄어듭니다.
즉 아치 양옆으로 4m씩, 눈에는 분명히 돌벽인 곳을 그동안 걸어서 통과할 수 있었습니다. 이게 제보받은 "성벽을 뚫고 지나가는 버그"의 정체였습니다. 이음매 문제와는 별개로 계속 있던 것이었고, 사실 배율을 키우기 전에도 있었습니다(예전엔 아치가 ±0.34인데 ±2.6을 비워뒀으니 비율로는 더 심했습니다).
몸이 스치지 않도록 ±1.0만 비우는 것으로 고쳤습니다.
세 문제의 원인이 결국 같았습니다. 눈에 보이는 것과 코드가 믿는 숫자가 달랐다는 것입니다.
셋 다 화면만 봐서는 알 수 없었고, 재보고 나서야 보였습니다. 앞으로도 "적당히 이 정도면 맞겠지" 싶은 숫자가 나오면 한 번은 재봐야겠습니다.
내일이 마감입니다. 이제 리허설만 남았습니다.