FPS Arena
맞은 자리가 몸에서 사라지는 아레나 FPS. 체력 막대 하나만 깎이는 게 아니라 어디를 맞았는지가 몸에 남습니다. 머리는 즉사, 팔이 부러지면 탄이 흩어지고, 다리가 나가면 뛰지 못합니다. 폭파 모드에는 라운드마다 벌어 쓰는 크레딧이 있고, 판이 끝나면 금화가 남습니다.
누구에게 필요한가요
한 발 한 발이 어디에 맞았는지가 다음 몇 초를 바꾸는 총싸움을 원하는 플레이어
주요 기능
- 맞은 부위가 몸에서 사라지고 히트박스도 같이 꺼진다
- 머리는 즉사, 팔이 부러지면 탄퍼짐 2.6배, 다리가 나가면 이동 -35%
- 부러진 부위는 필드 수리 키트로 되살린다
- 외워서 잡을 수 있는 고정 반동 패턴. 무기 6종은 총성도 1인칭 실루엣도 다르다
- 서기·앉기·포복 3단 자세. 엎드리면 실루엣이 30%로 줄고 탄이 모이는 대신 점프를 못 한다
- 맵 다섯 — 비전 유적·해동 해안·네오 서울·K타워 넥서스·한국 마을. 통째로 받아 오는 GLB다
- 맵은 고를 때 내려받는다. 전부 미리 받으면 첫 화면까지 84MB를 기다려야 한다
- 상자로 짓던 옛 맵 여섯은 걷어냈다. 섞어 두면 무작위 시작의 절반이 옛 맵이 된다
- 요원 스킬 셋 — 연막은 시야를 지우고, 섬광은 본 사람만 눈이 멀고, 벽은 총알과 길을 막는다
- 팀 데스매치와 폭파 두 가지 모드. 폭파는 부활 없는 라운드제로 5선승
- 폭파 모드의 크레딧 경제 — 킬과 라운드 승패로 벌어 총을 산다. 죽으면 산 총을 잃는다
- 진 팀도 크레딧을 받는다. 아무것도 못 받으면 한 번 밀린 팀이 영영 못 따라온다
- 봇도 총을 산다. 다만 밑천이 모자라면 사람처럼 아낀다
- 판이 끝나면 금화가 남아 옷과 총 도색을 산다. 판 안의 크레딧과는 다른 지갑이다
- 정산 화면이 아직 못 산 것 중 제일 싼 것을 집어 얼마 남았는지 알려 준다
- 3D 캐릭터 18종에 동작 22가지. 옷 스킨은 그림을 모델에 쏘아 붙여 UV로 굽는다
- 3인칭 시점과 상체 조준 — 몸이 조준선을 따라간다
- 봇 7명이 네비메시 위에서 순찰하고 엄폐물을 쓴다. 난이도 3단계
- 봇끼리 본 것을 나누되, 아무도 못 본 적은 절대 공유되지 않는다
- 온라인 멀티플레이 — 방을 열거나 목록에서 골라 들어간다. 한글 방 이름도 된다
- 비밀번호 방과 초대 코드. 초대로 연 방은 목록에 뜨지 않는다
- 사람이 들어오면 봇이 자리를 비켜 주고, 나가면 다시 채워진다
- Tab 점수판에 사람별 킬·데스·어시. 되감기 지연보상으로 손님이 조준한 시점에 판정한다
- 한글 닉네임과 온라인 순위 — 매치가 끝나면 상위 8명이 뜬다
- 설치 없이 브라우저에서 바로 실행
제품 방향
부위 파괴와 사격감에서 시작해 온라인 멀티플레이까지 올라왔고, 최근에는 게임의 성격 자체가 넓어졌습니다. 폭파 모드에 크레딧 경제가 들어가면서 라운드 하나하나가 다음 라운드의 밑천이 됐고, 요원 스킬 셋이 '서로를 먼저 본 쪽이 이긴다'는 총싸움의 기본을 사고팔 수 있게 만들었습니다. 캐릭터는 복셀 몸에서 3D 모델로 바뀌었고, 판이 끝나면 금화가 남아 다음 판의 이유가 됩니다. 맵은 상자로 짓던 여섯을 걷어내고 받아 온 다섯으로 갈았습니다 — 나란히 두면 무작위로 시작할 때 절반이 옛 맵이라, 새 맵을 만들어 놓고도 거기서 놀게 됩니다.
만들면서 쓴 글
- "\"상대가 지나갔는데 다시 지나간다\" — 프레임이 튄 게 아니었습니다"
멀티에서 남의 캐릭터를 서버가 보내 준 자리에 그대로 갖다 놓고 있었습니다. 스냅샷은 초당 스무 번 오고 화면은 예순 번 그립니다. 패킷이 늦거나 순서가 뒤바뀌면 지나갔던 자리로 되돌아갑니다.
- 평균 13ms인데 "뚝뚝 끊긴다"는 제보가 계속 왔습니다
평균만 보면 60fps인데 스무 프레임 중 하나가 33ms로 튀면 눈에는 그게 전부입니다. 원인을 찾는 데 계측을 세 번 새로 만들었고, 그 사이 제가 한 번은 원인을 잘못 짚어 글에도 그렇게 적었습니다.
- 조준하면 개머리판이 눈앞 11cm에 섰습니다
우클릭으로 조준하면 총이 화면을 통째로 덮었습니다. 조준 자세 좌표가 상자로 만들던 짧은 총 시절 값이라, 진짜 총 모델을 끼우자 개머리판이 뒤로 뻗어 눈에 박혔습니다. 저격총은 아예 카메라 뒤에 있었습니다.
- 새 맵을 만들어 놓고 옛 맵에서 놀고 있었습니다
받아 온 맵 다섯을 붙이고 예전 상자 맵 여섯을 그대로 뒀더니, 무작위로 시작할 때 절반이 옛 맵이었습니다. 여섯을 걷어냈습니다. 그리고 합치기 과정에서 맵 지오메트리 20%가 조용히 사라지고 있었습니다.
- 소스에서는 멀쩡하고 배포본에서만 부서지는 것 세 가지
3D 캐릭터를 붙였더니 브라우저에서만 블럭 몸으로 나왔고, 고쳤더니 전부 T자세로 걸어 다녔고, 그것도 고쳤는데 여전히 안 움직였습니다. 셋 다 개발 중에는 절대 안 나옵니다. 그리고 제가 "문제 없음"이라고 결론 낸 검사 방법 자체가 틀렸습니다.
- 최적화 네 개가 전부 헛방이었습니다 — 걸린 것과 효과가 있는 것은 다릅니다
3D 캐릭터가 복셀보다 프레임 타임이 두 배였습니다. 재질 공유, 그림자 끄기, 원거리 생략, 화면 밖 애니메이션 정지를 넣었고 넷 다 실제로 걸렸습니다. 프레임 타임은 하나도 안 움직였습니다.
- 화면이 하늘로 뒤집히던 것 — 브라우저가 준 숫자를 그냥 믿고 있었습니다
웹에서 시점이 갑자기 하늘로 튀고, 마우스가 화면 밖으로 나가고, 키가 눌린 채 굳었습니다. 넷 다 원인이 달랐지만 공통점이 하나 있었습니다. 브라우저가 알려 주는 값을 검사 없이 믿고 있었다는 것입니다.
- 소리가 나다 말다 하던 것 — 옆자리가 비어 있는데도 남의 소리를 뺏었습니다
여덟 명이 붙으면 총성이 뚝뚝 끊겼습니다. 소리를 내는 자리를 순서대로 돌려쓰고 있었는데, 비어 있는 자리를 건너뛰지 않고 순서가 된 자리를 그냥 뺏었습니다. 아직 울리는 중인 총성이 그대로 잘렸습니다.
- 소품에 실루엣이 생기자 숨어 있던 겹침이 드러났습니다
드럼통과 컨테이너를 블렌더 스크립트로 구워 얹었습니다. 판정은 그대로 상자로 두고 겉모습만 바꿨는데, 모양이 생기니까 배관이 건물 한복판에 묻혀 있던 게 눈에 보였습니다. 전부 원래부터 있던 것들이었습니다.
- 서버가 판정을 안 합니다 — 봇전을 온라인 멀티로 붙인 구조
기반 공사만 해 두고 미뤄 뒀던 온라인 멀티플레이를 실제로 연결했습니다. 서버는 중계만 하고 판정은 접속한 사람 중 하나가 전부 돌립니다. 서버에 권위를 주려면 같은 게임을 자바스크립트로 한 번 더 만들어야 했기 때문입니다.
- "\"어쩌다가 만나지기도 함\" — 이 한 줄이 원인을 알려 줬습니다"
멀티 방에 들어가면 아무도 안 보이고, 어떤 사람은 무한 데스에 걸렸습니다. 증상은 둘인데 원인은 하나였습니다. 각자 맵을 따로 뽑고 있었고, 6분의 1 확률로 같은 맵일 때만 실제로 만나졌습니다.
- 되감기를 만들어 놓고 어디에도 연결하지 않았습니다
지연보상 코드는 진작 있었는데 부르는 곳이 테스트 한 군데뿐이었습니다. 실제 게임은 모든 사격을 "지금"으로 판정하고 있었습니다. 연결하고 나서도 총알이 통과했는데, 원인은 Godot이 변환을 다음 물리 스텝으로 미루기 때문이었습니다.
- 겹침 0쌍은 거짓말이었습니다 — 검사가 드럼통을 아예 못 보고 있었습니다
며칠 전 "여섯 맵 모두 겹침 0쌍"이라고 적었습니다. 제보 스크린샷에는 드럼통이 파란 방벽에 박혀 있었습니다. 검사가 통과한 게 아니라, 검사 대상에서 드럼통 열두 개가 통째로 빠져 있었습니다.
- 게임은 멀쩡했고 내 테스트가 틀렸다 — 세 번 연속으로
폭파 모드를 넣고 검증했더니 같은 맵에서 성공과 실패가 섞여 나왔습니다. 원인을 세 번 짚었고 세 번 다 틀렸습니다. 셋 다 게임이 아니라 테스트 쪽 문제였습니다.
- 봇을 측면으로 돌게 했더니 아무도 못 맞혔다
봇 일곱이 각자 놀던 걸 분대로 묶었습니다. 정보를 공유하고 역할을 나누게 하자 곧바로 명중률이 25%에서 7%로 떨어졌습니다. 전술을 추가할 때는 그게 기존 규칙과 어떻게 곱해지는지를 먼저 봤어야 했습니다.
- 이동 7/7 · 생존 7 · 발사 0 — 지표가 전부 초록인 죽은 맵
화물선 맵에서 20초 동안 총알이 한 발도 안 나갔습니다. 봇은 다 살아 있었고 다 움직이고 있었습니다. 제가 보고 있던 지표로는 이 고장이 절대 안 보였습니다.
- 봇이 계단을 안 오른 게 아니라, 계단이 벽에 처박혀 있었다
교전 중에도 높은 자리를 잡게 하고 포복을 넣었습니다. 그 과정에서 계단 세 개가 애초에 못 올라가는 물건이었다는 걸 알았습니다. 하나는 몇 주째 그 상태였습니다.
- 웹에 올리면서 네 번 데인 것 — 37MB wasm, 사라지는 헤더, 안 바뀌는 캐시, 없는 글자
FPS Arena를 브라우저에서 돌게 만드는 과정에서 걸린 함정들입니다. 전부 "빌드는 성공했는데 화면이 틀린" 종류였고, 하나는 배포한 뒤에도 한참 동안 원인을 못 찾았습니다.
- 폰에서는 만지기만 해도 총이 나갔다 — 모바일 조작을 뜯어고친 기록
조이스틱을 끌면 총이 계속 발사되고, 버튼을 탭하면 화면이 돌고, 글씨는 작아서 안 보였습니다. 원인 셋이 다 달랐고, 공통점은 제가 모바일 화면을 한 번도 안 봤다는 것이었습니다.
- 체력이 아니라 팔이 깎인다 — 부위 파괴를 실제로 켜지게 만든 것
FPS Arena는 맞은 자리가 블럭째 떨어져 나갑니다. 그런데 처음 만든 규칙으로는 그 시스템이 20초에 한 번도 발동하지 않았습니다. 팔다리 체력을 몸 체력에서 떼어내고 나서야 게임이 됐습니다.

현재 상태
프로토타입 공개
- 개발 시작 2026년 8월
- 마지막 작업 2026.08.24
플레이 안내
- 마우스 조준은 화면을 한 번 클릭해야 잠깁니다. 브라우저 정책입니다
- 모바일에서는 화면 조이스틱이 자동으로 뜹니다
- 첫 로딩에 약 28MB를 받고, 받아 온 맵을 고르면 그 맵을 5~19MB 더 받습니다. 한 번 받으면 브라우저가 캐시합니다
- 웹은 단일 스레드로 돌아 PC 네이티브보다 느립니다
- 무기 이름은 전부 가상이며 실제 총기와 무관합니다
- 총 모델은 Quaternius의 Ultimate Gun Pack(CC0)이고, 캐릭터와 동작은 Mixamo(Adobe)입니다. 맵 다섯은 받아 온 GLB이며, 나머지 맵·효과음·소품은 코드와 블렌더 스크립트로 만듭니다