보이지 않는 것을 보여주기
2026.09 · 기술 노트 · 시야와 기척
2D 아이소메트릭에는 원리적인 한계가 하나 있습니다. 캐릭터는 커서 쪽을 보는데, 화면은 항상 같은 방향을 보고 있다는 것입니다.
3D라면 뒤를 보고 싶을 때 카메라를 돌리면 됩니다. 2D에서는 못 돌립니다. 그러니까 캐릭터 뒤에서 뭔가 다가와도 플레이어는 그냥 화면에 나온 걸 볼 뿐입니다. 긴장이 생길 자리가 없습니다.
일단 시야를 만들었습니다
캐릭터가 보는 쪽으로 110도, 22타일까지 부채꼴로 시야를 열었습니다. 바로 옆 2.5타일은 방향과 상관없이 보입니다. 등 뒤에 딱 붙은 걸 못 본다고 하면 그건 그거대로 이상하니까요.
지형도 시야를 막습니다. 높은 블록 뒤나 절벽 너머는 안 보입니다.
여기서 성능 함정을 하나 밟았습니다. 처음엔 화면 전체(53×53칸)의 시야를 매번 계산해서 텍스처로 올렸습니다. 그런데 실제로 필요한 건 "지금 이 몬스터가 보이나?" 하나뿐이었습니다.
지금은 실제로 물어본 칸만 계산합니다. 같은 칸은 그 프레임 동안 캐시하고, 지형 높이는 0.25초 캐시합니다. 같은 칸을 100번 물어봐도 레이는 한 번만 나갑니다.

안개는 쓰지 않습니다
시야 밖을 반투명한 안개로 덮어 봤습니다. 부채꼴 밖은 뿌옇고, 안쪽만 또렷하게요.
보기엔 그럴듯했는데 계속 보고 있기가 피곤했습니다. 생활하는 게임인데 화면 대부분이 항상 뿌옇습니다. 밭에 물 주는 동안에도 뿌옇고, 창고를 정리하는 동안에도 뿌옇습니다.
걷어냈습니다. 안개 셰이더째로 지웠습니다.
그런데 안개를 지우고 나니 원래 문제가 그대로 돌아왔습니다. 시야 밖 몬스터가 안 보이는 건 맞는데, 그냥 안 보이면 플레이어는 적이 없다고 읽습니다. 가리는 게 목적이 아니라 긴장을 만드는 게 목적이었는데요.
그래서 소리 대신 발자국을 그렸습니다
지금 방식은 이렇습니다. 안 보이는 생명체가 움직이면, 그 자리에 작은 발자국이 하나 남고 1초쯤 뒤에 사라집니다.
들리는 거리는 16타일입니다. 0.28초에 한 번, 0.12타일을 움직일 때마다 하나씩 생깁니다. 사람이 걷는 보폭 정도요. 가까울수록 진하게 나옵니다.
중요한 건 움직여야 생긴다는 점입니다. 가만히 있는 건 발자국이 안 남습니다. 그래서 화면 구석에 점이 하나씩 찍히기 시작하면 뭔가가 이쪽으로 오고 있다는 뜻입니다.
그리고 그 생명체나 발자국 자리가 보이게 되는 순간 발자국은 즉시 사라집니다. 눈으로 볼 수 있는데 기척까지 남아 있으면 두 겹이 되니까요.
영구 흔적은 아닙니다. 타일이나 눈, 물에 자국을 쓰지 않습니다. 최대 128개를 메시 하나에 모아서 그립니다.
밝은 지면에서의 대비
만들어 놓고 사막에 가 보니 발자국이 사라져 있었습니다.
어두운 반투명으로 그리고 있었는데, 밝은 모래 위에서는 대비가 거의 없었습니다. 반대로 어두운 밤 땅에서는 너무 잘 보였고요.
지금은 한 번에 어두운 얇은 테두리와 밝은 속면을 같이 그립니다. 밝은 바닥에서는 테두리가 보이고, 어두운 바닥에서는 속면이 보입니다. 거리에 따른 감쇠도 제곱근으로 바꿔서 멀어져도 너무 급하게 사라지지 않게 했습니다.

마지막으로 본 모습은 그 자리에 남습니다
발자국만으로는 "뭔가 있다"까지만 됩니다. "저기 곰이 있었다"는 안 됩니다.
그래서 기억을 넣었습니다. 생명체가 시야에서 사라지기 직전에, 그 순간의 스프라이트 자세를 정지 메시로 굽습니다. 애니메이션이 돌던 그 프레임의 변형된 정점과 UV를 그대로 떠 옵니다.
이후로는 회색 반투명으로 그 자리에 남습니다. 실제 개체가 움직여도 따라가지 않고, 애니메이션도 돌지 않습니다. 마지막으로 본 모습 그대로요.
게임 시간으로 하루가 지나면 잊습니다. 그 자리를 다시 봤는데 아무것도 없으면 기억도 지웁니다. 다시 만나면 새 모습으로 갱신하고요.
Animator도, 추가 카메라도, 렌더 타깃도 쓰지 않습니다. 원래 아틀라스를 그대로 공유합니다. 기억은 최대 128개, 추적은 384개까지 들고 있다가 넘치면 오래된 것부터 버립니다.

기억을 지면 위에 세우기
여기에도 함정이 있습니다. 키 큰 몬스터의 기억을 남기면 하반신이 지형에 묻힙니다.
원인은 정렬 기준이었습니다. 실제 몬스터는 발밑을 기준으로 정렬하는데, 기억은 메시 중심을 기준으로 정렬하고 있었습니다. 키가 클수록 중심이 위로 올라가니까 그만큼 뒤로 밀려서 지형에 덮였습니다.
지금은 캡처하는 순간의 발 위치를 기억 루트에 저장하고, 정점은 그 발 원점을 뺀 좌표로 굽습니다. 원본의 정렬 설정도 그대로 복사해 옵니다. 그래서 앞쪽 지형에는 여전히 가려지고, 뒤쪽 지형은 안 가립니다. 최상단에 덮어 그리는 식으로 도망가지 않았습니다.
결국 이 셋이 한 묶음입니다
시야, 기척, 기억. 하나만 빠져도 의도가 안 삽니다.
시야만 있으면 그냥 안 보이는 겁니다. 기척만 있으면 뭔지 모릅니다. 기억만 있으면 지금 어디 있는지 모릅니다.
셋이 같이 있어야 "아까 저기서 곰을 봤는데, 지금 이쪽으로 오고 있다"가 됩니다. 그게 만들고 싶었던 것입니다.