NTS Apps. 문의

개발 기록

앱과 게임을 만들고 고친 과정을 실제 경험 그대로 적습니다. 문제, 이전 상태, 선택한 해결, 결과의 순서로 남기고, 짧은 변경은 아래 릴리스 노트에 둡니다.

옷을 세 벌 입혀도 비용이 안 늘게 만들었습니다

상의·하의·신발을 부위별로 골라 섞어 입는 시스템을 넣었습니다. 그냥 얹으면 입힌 만큼 그릴 것이 늘어납니다. 실행 중에 한 벌로 합쳐 구워서, 몇 개를 끼워도 표면이 하나만 늘어나게 했습니다.

봇이 조용했습니다 — 오류도 안 내고

벙개벙개 대화방에 AI 봇을 붙였습니다. 불러도 아무 말이 없는 경우가 두 가지 있었는데, 하나는 생각하느라 답할 예산을 다 써서였고 하나는 답이 JSON이 아니라 파싱에 실패해서였습니다. 둘 다 오류가 나지 않습니다.

파향 화살표가 정반대를 가리키고 있었습니다

낚시일기 물때 위젯에 실시간 파고와 너울을 붙였습니다. 파향 화살표를 그리고 나서 방향이 이상해 문서와 실측을 둘 다 확인했는데, 데이터가 말하는 각도는 파도가 가는 쪽이 아니라 오는 쪽이었습니다.

새 맵을 만들어 놓고 옛 맵에서 놀고 있었습니다

받아 온 맵 다섯을 붙이고 예전 상자 맵 여섯을 그대로 뒀더니, 무작위로 시작할 때 절반이 옛 맵이었습니다. 여섯을 걷어냈습니다. 그리고 합치기 과정에서 맵 지오메트리 20%가 조용히 사라지고 있었습니다.

조준하면 개머리판이 눈앞 11cm에 섰습니다

우클릭으로 조준하면 총이 화면을 통째로 덮었습니다. 조준 자세 좌표가 상자로 만들던 짧은 총 시절 값이라, 진짜 총 모델을 끼우자 개머리판이 뒤로 뻗어 눈에 박혔습니다. 저격총은 아예 카메라 뒤에 있었습니다.

소스에서는 멀쩡하고 배포본에서만 부서지는 것 세 가지

3D 캐릭터를 붙였더니 브라우저에서만 블럭 몸으로 나왔고, 고쳤더니 전부 T자세로 걸어 다녔고, 그것도 고쳤는데 여전히 안 움직였습니다. 셋 다 개발 중에는 절대 안 나옵니다. 그리고 제가 "문제 없음"이라고 결론 낸 검사 방법 자체가 틀렸습니다.

랩을 버렸습니다 — 원에는 이야기가 없습니다

코스를 도는 레이싱을 섬에서 섬으로 가는 항해로 바꿨습니다. 나빠지는 날씨, 차오르는 선체, 뒤에 붙는 배는 가려는 곳이 있어야 의미가 생깁니다. 그리고 배수를 공짜에서 배터리를 쓰는 일로 바꾸자 고리가 닫혔습니다.

애드센스가 "가치가 별로 없는 콘텐츠"라고 했습니다

심사에서 거절당했습니다. 저는 신청해도 되는 상태라고 판단했었고, 판단 근거는 분량이었습니다. 페이지를 재 보니 분량은 문제가 아니었고, 얇은 페이지가 어디에 있느냐가 문제였습니다.

어종 12종을 넣어 놓고 한 마리도 잡을 수 없었습니다

표를 채우지 않아서 루어의 매력도가 전부 0으로 조회됐고, 매력도 0이면 물고기가 즉시 떠납니다. 참돔도 감성돔도 돌돔도 우럭도 이론상의 존재였습니다. 확인하려고 만든 시뮬레이터는 처음에 제 잘못된 가정 때문에 전부 0을 뱉었습니다.

"\"몇몇만 총을 쏜다\" — 실제로 그랬습니다"

무리가 200마리든 20마리든 화면에서 총을 쏘는 건 한 마리처럼 보였습니다. 발사가 한 번에 한 발이었고 쏘는 놈을 무작위로 뽑았기 때문입니다. 고치면서 인원수와 무기를 서로 다른 축으로 갈라 놓았습니다.

"\"이게 물고기냐\" — 돌고래가 흰 물고기로 보인 이유 셋"

물고기를 넣었더니 돌고래가 그냥 흰 물고기였습니다. 지느러미가 두께 0이었고, 몸통 만드는 방식이 주둥이 있는 형태를 못 만들었고, 광택이 너무 세서 무늬를 통째로 지우고 있었습니다. 물고기가 오직 물을 통해서만 보인다는 사실이 나머지 설계를 거의 다 정했습니다.

쇄파선은 해변의 성질이 아니라 바다의 성질입니다

파도가 부서지는 선을 섬 둘레의 고정된 원으로 잡으면 강풍에서 모래 위에 파도가 부서집니다. 파도는 자기 파고에 견줄 만한 수심에서 부서지므로 그 선은 바다가 정합니다. 그리고 배에는 지형 충돌이 아예 없어서 섬을 뚫고 지나가고 있었습니다.

되감기를 만들어 놓고 어디에도 연결하지 않았습니다

지연보상 코드는 진작 있었는데 부르는 곳이 테스트 한 군데뿐이었습니다. 실제 게임은 모든 사격을 "지금"으로 판정하고 있었습니다. 연결하고 나서도 총알이 통과했는데, 원인은 Godot이 변환을 다음 물리 스텝으로 미루기 때문이었습니다.

봇을 측면으로 돌게 했더니 아무도 못 맞혔다

봇 일곱이 각자 놀던 걸 분대로 묶었습니다. 정보를 공유하고 역할을 나누게 하자 곧바로 명중률이 25%에서 7%로 떨어졌습니다. 전술을 추가할 때는 그게 기존 규칙과 어떻게 곱해지는지를 먼저 봤어야 했습니다.

직접 해보게 했더니 시점부터 틀렸더라

스크랩 워를 쿼터뷰에서 횡스크롤로 갈아엎었습니다. "컨트롤도 어렵고 총체적 난국"이라는 말을 듣고 원인을 짚어 보니 조작이 아니라 카메라였습니다. 같은 날 성능도 실측해서 드로우콜을 551에서 345로 내렸습니다.

버벅인다는 제보의 원인은 프레임률이 아니었다

Tiny Knight Rush가 스웜에서 끊긴다는 제보를 받고 성능을 고쳤는데 체감이 없었습니다. 재보니 게임 프레임의 43.5%가 시간이 0인 채로 지나가고 있었습니다. 렌더러는 60fps로 멀쩡히 돌고 있었고, 멈춰 있던 건 세계였습니다.

릴리스 노트

개별 글로 쓰기에는 짧은 변경 기록입니다. 부풀리는 대신 목록으로 보존합니다.

2026.08.28

Monster Arc — 캐릭터 열둘, 스테이지, 성장

소개를 실제 게임에 맞춰 다시 썼습니다. 캐릭터 열두 명 중 셋을 파티 슬롯에 넣고, 장마다 스테이지 열 개를 에너지를 써서 출격합니다. 돌아오면 골드·균열 파편·기억의 조각 같은 재화로 키우고 의상을 갈아입힙니다. 처음 올릴 때 회색박스 화면밖에 없어 그렇게 적어 뒀는데, 실제 화면을 받아 전부 교체했습니다.

2026.08.28

Monster Arc — 옷을 세 벌 입혀도 비용이 안 늘게

상의·하의·신발을 부위별로 섞어 입는데, 그냥 얹으면 입힌 만큼 그릴 것이 늘어납니다. 파티가 셋이니 곱해지고요. 실행 중에 한 벌로 합쳐 구워서 몇 개를 끼워도 표면이 하나만 늘어납니다. 꾸미라고 만든 시스템이 안 꾸미는 쪽을 권하면 안 됩니다.

2026.08.28

Monster Arc를 올렸습니다

파티 셋을 실시간으로 갈아타며 싸우는 쿼터뷰 액션 RPG입니다. ntsapp.dev/monster 에서 바로 해볼 수 있습니다. TAG로 조종 대상을 바꾸고, 나머지 둘은 스스로 싸웁니다. 게임 안에서 얼굴과 체형을 만들고 의상을 갈아입힙니다.

2026.08.28

Monster Arc — 137MB를 25MiB 한도에 올린 방법

gzip으로는 97.4MB까지밖에 안 줄어 여전히 한도의 네 배였습니다. 패키지를 20MiB 조각 일곱 개로 자르고 워커가 이어 붙입니다. 한꺼번에 받으면 137MB가 워커 메모리에 얹혀서, 한 조각씩 순서대로 받아 흘려보냅니다. 엔진 실행 파일은 압축이 통해 37.7MB가 9.8MB가 됐습니다.

2026.08.26

LiquidPvP를 Godot으로 전면 재작성했습니다

Unity로 만들었던 것을 Godot 4.7.2로 다시 썼습니다. 기능이 모자라서가 아니라 빌드와 반복이 무거워 손이 안 가서였고, 로직과 수치는 옛 프로젝트에서 그대로 옮겼습니다 — 엔진과 규칙을 같이 바꾸면 나중에 뭐가 원인인지 못 가립니다. 33커밋으로 온라인 대전과 안드로이드 빌드까지 왔습니다.

2026.08.26

LiquidPvP — 액체를 셰이더로 다시 만들었습니다

원을 그리고 사이를 이어 붙이던 것을 메타볼 셰이더로 바꿨습니다. 각 칸이 주변에 퍼뜨리는 값을 더해 임계값을 넘는 곳을 칠하면 합쳐지는 모양이 저절로 나오고, 같은 색끼리만 더하니 다른 색은 섞이지 않습니다. 손으로 그리던 넥·블롭·스쿼시 보조 함수가 전부 없어졌습니다.

2026.08.26

LiquidPvP — 온라인 대전에 전용 서버를 두지 않았습니다

오가는 데이터를 세어 보니 격자 128자와 염색조 8자, 점수뿐이라 실시간 채널만으로 충분했습니다. P2P를 쓰면 네이티브 확장이 필요한데 얻는 게 없었습니다. 방 번호가 곧 채널 이름이고, 벙개벙개가 쓰던 백엔드를 그대로 씁니다. 그리고 APK를 뜯으면 평문으로 읽히던 접속 정보를 빌드에서 뺐습니다.

2026.08.25

벙개벙개 대화방에 AI 봇

이름이나 @로 부르면 답하고, 켜 두면 가끔 먼저 거듭니다. 방마다 성격과 능력을 정하고 실시간 검색·사진 분석을 따로 켤 수 있습니다. 하루 답변 상한을 둬서 명시적으로 불러도 예산을 넘지 않게 했고, 프롬프트에는 "범용 비서가 아니라 이 방의 대화 참가자"라는 울타리를 상시 넣었습니다.

2026.08.25

벙개벙개 — 봇이 오류 없이 조용하던 두 가지 이유

답변 상한 120토큰 중 117을 사고에 쓰고 답이 빈 문자열로 끝나던 것, 그리고 검색을 켜면 응답이 JSON이 아니라 산문으로 오는데 받는 쪽이 JSON만 기다려 멀쩡한 답을 버리던 것. 둘 다 오류가 나지 않아 로그가 깨끗했습니다. 이제 검색이 막히면 검색 없이 다시 불러서, 라이브 정보만 못 줄 뿐 답은 합니다.

2026.08.25

낚시일기 — 실시간 파고와 너울

물때 위젯에 이름만 붙여 두고 비워 뒀던 "파고" 자리를 채웠습니다. 파고·너울·파주기·파향을 받아 오고, 큰 값 기준 1.0m부터 주의 1.5m부터 위험을 표시합니다. 키가 필요 없는 자료를 골랐습니다 — 유료 구독으로 시작하면 그 구독이 끊기는 날 기능도 끊깁니다.

2026.08.25

낚시일기 — 파향 화살표가 반대를 가리키던 것

이 값은 파도가 오는 방향인데 화살표가 그쪽을 가리켜서, 파도가 육지에서 바다로 나가는 것처럼 보였습니다. 문서만 믿지 않고 같은 시각의 풍향과 파향을 세 항구에서 비교했습니다(여수 13°·부산 4°·인천 6° 차이). 화살표는 진행 방향으로 돌리고, 카드에는 오는 방향을 한글 8방위로 함께 적었습니다.

2026.08.24

FPS Arena — 평균은 60fps인데 끊긴다던 것

평균 13ms인데 뚝뚝 끊긴다는 제보가 계속 왔습니다. 스무 프레임 중 하나가 33ms로 튀면 눈에는 그게 전부입니다. 봇 아홉이 시야 검사를 같은 프레임에 몰아 하던 것, 합친 메시로 충돌까지 세워 레이 하나가 20만 삼각형을 때리던 것, 그리고 판 도중 2.9초씩 멈추던 셰이더 링크를 잡았습니다. 한국 마을 웹 실측 평균 19.0 → 12.2ms.

2026.08.24

FPS Arena — 상대가 지나갔다 되돌아오던 것

멀티에서 남의 캐릭터를 서버가 준 자리에 그대로 갖다 놓고 있었습니다. 스냅샷은 초당 스무 번, 화면은 예순 번이라 뚝뚝 끊기고, 패킷 순서가 뒤바뀌면 지나갔던 자리로 되돌아갑니다. 이제 목표로만 받아 두고 매 프레임 다가갑니다. 되감기 판정용 경로는 즉시 반영이라 따로 뒀습니다.

2026.08.24

FPS Arena — 컴퓨터용 빌드와 Godot 4.7.2

윈도우 실행 파일을 낼 수 있게 했습니다. 맵은 웹에서 그랬듯 실행 파일 옆 폴더에서 읽습니다. 엔진도 4.7.2로 옮겼고, 조준 자세는 총 길이가 아니라 실제 모델의 윗면과 뒤끝을 재서 잡도록 다시 고쳤습니다 — 같은 길이라도 모델마다 몸통 높이가 달라서 기관단총이 조준점을 덮고 있었습니다.

2026.08.21

FPS Arena — 상자 맵 여섯을 걷어냈습니다

받아 온 GLB 맵 다섯 옆에 예전 상자 맵 여섯을 그대로 뒀더니, 무작위로 시작할 때 절반이 옛 맵이었습니다. 새 맵을 다섯 개 만들어 놓고 절반만 쓰던 셈이라 여섯을 뺐습니다. 그리고 재질별로 메시를 합칠 때 지오메트리 20%가 조용히 사라지고 있던 것도 고쳤습니다 — 한국 마을이 231,900에서 278,352 삼각형이 되면서 전통 대문과 기와지붕이 돌아왔습니다.

2026.08.21

FPS Arena — 조준하면 총이 화면을 덮던 것

조준 자세 좌표가 상자로 총을 만들던 시절 값이라, 진짜 모델을 끼우자 개머리판이 눈에서 11cm 앞에 섰습니다. 저격총은 아예 카메라 뒤였습니다. 이제 총 길이에서 계산합니다. 판 설정이 두 번 떠서 고른 값이 날아가던 것, 폭파 모드에서 총을 살 수 없던 것도 함께 고쳤습니다.

2026.08.21

FPS Arena — 스킨 261장과 소개 페이지 전면 갱신

캐릭터마다 UV가 다르고 한 캐릭터도 몸·머리카락·눈썹이 서로 다른 원본을 써서, 스킨을 원본 텍스처 이름으로 갈아 끼우게 했습니다(여성 6종×12, 남성 9종×9). 무손실이면 226MB라 512px 압축으로 10.8MB까지 줄였습니다. 사이트의 FPS 소개도 다시 썼습니다 — 복셀·맵 6종·"외부 에셋 없음"이 전부 사실이 아니게 돼 있었습니다.

2026.08.19

FPS Arena가 거의 다른 게임이 됐습니다

폭파 모드에 크레딧 경제가 들어갔습니다. 킬과 라운드 승패로 벌어 총을 사고, 죽으면 산 총을 잃습니다. 진 팀도 받습니다 — 아무것도 못 받으면 한 번 밀린 팀이 영영 못 따라옵니다. 요원 스킬 셋(연막·섬광·벽)이 붙어 "서로를 먼저 본 쪽이 이긴다"를 사고팔 수 있게 됐고, 판이 끝나면 금화가 남아 옷과 도색을 삽니다.

2026.08.19

FPS Arena — 맵 11종, 그리고 캐릭터가 3D로

절차적으로 짓던 여섯에 통째로 받아 오는 다섯(비전 유적·해동 해안·네오 서울·K타워 넥서스·한국 마을)이 더해졌습니다. 다섯을 전부 담으면 첫 화면까지 84MB를 기다려야 해서 고를 때 받습니다. 캐릭터는 복셀 몸에서 3D 모델 18종으로 바뀌었고, 그에 맞춰 앱 소개의 "내려받은 에셋 0"도 사실대로 고쳤습니다.

2026.08.19

FPS Arena — 배포본에서만 부서지던 것 셋

3D 캐릭터가 브라우저에서만 복셀 몸으로 떨어졌습니다. 폴더 이름 대소문자였는데, 윈도우는 안 가리고 배포 패키지는 가립니다. 고치니 전부 T자세로 걸어 다녔고(폴더를 나열하면 원본이 아니라 껍데기 이름이 나옵니다), 그것도 고쳤는데 여전히 안 움직였습니다(등록 이름에도 껍데기가 붙었습니다). 검사가 "실렸는가"만 묻고 "움직이는가"를 묻지 않아 전부 통과하고 있었습니다.

2026.08.19

FPS Arena에 옷 스킨과 새 무기 모델

평면 그림은 UV와 안 맞아 그냥 못 씁니다. T자세 앞뒤 두 장을 모델에 쏘아 붙인 뒤 원래 UV로 다시 구워, UV 배치를 몰라도 옷이 붙게 했습니다. 여섯 캐릭터에 각각 다른 의상이 들어갑니다. 무기 6종도 새 모델로 갈았고, 원화 작업 폴더가 배포에 섞여 있어 빼면서 웹 전송량이 49.3MB에서 24.5MB가 됐습니다.

2026.08.19

사이트 — 읽을 것이 없는 페이지 아홉 개를 더 찾았습니다

애드센스 대응으로 얇은 페이지를 고친 뒤 다시 재다가, 게임 경로 아홉 개가 본문 7~391자인데 전부 색인이 열려 있는 것을 발견했습니다. 화면 전체가 캔버스라 읽을 글자가 로딩 문구뿐입니다. robots.txt로 막았습니다 — 게임은 각자 다른 워커가 서빙해서 Pages 헤더가 닿지 않기 때문입니다. 실제 소개 문서인 /tiny/ 와 /fps/ 는 열어 뒀습니다.

2026.08.19

보트 레이싱이 랩을 버리고 항해로 갔습니다

코스를 도는 레이싱을 섬에서 섬으로 가는 항해로 바꿨습니다. 원에는 목적지가 없어서, 나빠지는 날씨도 차오르는 선체도 랩타임 손해일 뿐이었습니다. 배수를 공짜에서 배터리를 쓰는 일로 바꾸자 고리가 닫혔습니다 — 거친 물은 쫓는 배를 떨구지만 선체를 채우고, 펌프는 배터리를 쓰고, 배터리가 죽으면 레이더가 함께 죽습니다. 접속하지 않은 동안에도 배가 갑니다.

2026.08.19

FPS Arena에 3D 캐릭터 — 그리는 횟수가 전부였습니다

3D 캐릭터가 복셀보다 프레임 타임이 두 배였습니다. 재질 공유·그림자 끄기·원거리 생략·화면 밖 정지를 넣었고 넷 다 실제로 걸렸는데 프레임 타임은 안 움직였습니다. 하나씩 통째로 꺼 보니 남는 값이 전부 그리는 횟수였고, 부위별로 나뉜 메시를 합쳐 절반 가까이 줄였습니다. 3인칭 시점과 상체 조준도 함께 붙였습니다.

2026.08.19

Tiny Knight Rush v1.2.55 — 초반이 헐거웠습니다

등장 일정이 문자 그대로 초당 한 마리로 시작하고 있었습니다. 웨이브 최소치를 3으로 두고 간격을 줄여 초반이 초당 다섯 마리로 열립니다. 1분 시점 처치 수가 64에서 330이 됐습니다. 후반은 이미 상한에 묶여 있어 거의 그대로입니다. 핵 아이콘이 물약과 8픽셀에서 같은 그림이던 것도 버섯구름으로 바꿨습니다.

2026.08.19

FFT 바다가 남해 다도해로

물색과 식생, 바위를 남해 쪽으로 다시 잡았습니다. 소나무와 화강암, 맑은 열대 해수 대신 남해 물색입니다. 하늘 조도 계산을 한 곳으로 모으고 노출 규약을 통일했으며, 오래 남아 있던 미해결 항목 두 개는 다시 재서 정정했습니다.

2026.08.19

사이트 — 애드센스가 지적한 곳을 고쳤습니다

심사에서 「가치가 별로 없는 콘텐츠」로 거절당했습니다. 재 보니 분량이 아니라 얇은 페이지의 위치가 문제였습니다. 검색창뿐인 127자 페이지가 색인 대상이었고, 정작 스토어에 출시한 앱 넷의 소개가 가장 얇았습니다. 읽을 것이 없는 페이지는 색인에서 빼고, 출시작 소개는 화면 사진과 함께 다시 썼습니다.

2026.08.18

보트 레이싱을 올렸습니다

FFT 바다 엔진에서 갈라져 나온 레이싱입니다. ntsapp.dev/racing 에서 볼 수 있습니다. 코스는 씨앗 하나에서 생성되고, 게이트 통과는 반경이 아니라 평면 교차로 판정합니다 — 반경으로 재면 빠른 배가 그냥 뚫고 지나갑니다. AI 상대는 사람과 똑같이 스로틀과 타 두 값만 만집니다.

2026.08.18

주식 레이더 — 게임이 아닌 것 하나

뉴스와 재무제표를 규칙으로 점수화해 종목을 훑는 리서치 보조 도구입니다. 매일 아침 GitHub Actions가 스스로 갱신합니다. 다만 성과 추적이 없어 이 점수가 실제로 맞았는지는 검증되지 않았습니다. 투자 추천이 아니고, 개인용을 전제로 만들어 검색 색인에서는 빼 뒀습니다.

2026.08.12

낚시 — 어종 12종을 한 마리도 잡을 수 없던 버그

루어의 어종별 매력도 표를 채우지 않아 전부 0으로 조회됐고, 매력도 0이면 물고기가 즉시 떠납니다. 참돔도 감성돔도 돌돔도 우럭도 이론상의 존재였습니다. 채비 11개 × 어종 19종을 누락 0으로 채우고, 미끼와 밑밥을 넣었습니다. 실제 입질 엔진을 그대로 돌리는 시뮬레이터로 루어별 서열까지 확인했습니다.

2026.08.12

낚시 — 조용히 거절하던 것들

"버튼이 안 먹는다"는 제보 셋이 전부 같은 모양이었습니다. 막힌 게 맞는데 막힌 이유가 안 보였습니다. 거절 사유를 낚시 중에는 숨겨지는 패널에 적고 있었고, 좌초는 매 프레임 계산해 놓고 아무도 읽지 않았습니다. 조타 잠금도 낚싯대를 든 것이 아니라 줄이 나간 것에 다시 묶었습니다.

2026.08.12

낚시 — 아이콘 바와 실물 치수 장비

알파벳 키 아홉 개로만 되던 조작을 아이콘 버튼으로 옮겼습니다. 이동과 스페이스는 키에 남겼습니다 — 누른 채로 있고 다른 데를 보면서 쓰는 조작이라 버튼이 더 나쁩니다. 장비는 실물 치수로 다시 쟀습니다. 3000번 릴 몸통이 55mm인데 68mm로 들어가 있었습니다.

2026.08.12

낚시 게임을 새로 올렸습니다

FFT 바다 엔진에서 갈라져 나온 보트 낚시입니다. ntsapp.dev/fishing 에서 바로 해볼 수 있습니다. 캐스팅부터 입질, 파이팅, 랜딩까지 한 바퀴가 돌아갑니다. 바다와 물속과 섬은 그대로 물려받았고 그 위에 낚시 규칙과 어체 12종을 새로 얹었습니다.

2026.08.11

FFT 바다에 물 밑이 생겼습니다

수중을 상수 색으로 칠하던 것을 굴절 패스로 바꿨습니다. 바다와 하늘을 뺀 씬을 따로 그린 뒤 물 셰이더가 화면 좌표를 굴절시켜 읽습니다. 물기둥 두께는 가정하지 않고 깊이로 재기 때문에 외해에서는 광로가 길어져 항이 스스로 사라집니다. 그 위에 돌고래·상어·열대어가 얹혔습니다.

2026.08.11

배가 6.5노트에서 18.6노트로

프로브 항력이 전체 저항의 92%를 차지하며 전진까지 묶고 있었습니다. 히브와 롤을 잡으려고 저면적 기준으로 크기를 잡은 항이라 전후 방향에는 과대했습니다. 속도가 오르자 느릴 땐 닿지 못하던 결함 둘이 드러나 함께 고쳤습니다 — 피치 69도로 영구 고착되던 것과, 선수가 처박혀도 추력이 계속 나오던 것입니다.

2026.08.11

해안 쇄파와 좌초, 그리고 켈빈 V자 항적

쇄파선을 고정된 원이 아니라 파고로 정해지는 수심 등고선으로 잡았습니다. 미풍이면 수심 1.5m 부근, 강풍이면 8m까지 밀려납니다. 배에는 지형 접촉이 아예 없어 섬을 뚫고 지나갔는데, 부력과 같은 프로브에 접촉을 걸어 완만한 해변에는 선수부터 얹히게 했습니다.

2026.08.11

Tiny Knight Rush — 잡몹만 빨리 녹습니다

일반 몹의 체력을 70%로 낮췄습니다. 정예 판정 이후에 적용해서 정예 배수와 보스 곡선은 건드리지 않습니다. 같은 시간의 처치 수는 거의 그대로인데(1211→1248) 처치 속도가 아니라 등장 속도가 상한이기 때문이고, 실제로 바뀌는 것은 한 마리당 때리는 횟수로 30% 줄어듭니다.

2026.08.11

FPS Arena — 설정 화면에서 커서를 잃던 것

일시정지에서 판 설정으로 갈 때 포인터를 다시 잠갔다가 곧바로 푸는 왕복이 있었습니다. 웹에서 잠금을 풀면 커서가 브라우저가 정한 자리로 돌아가는데, 모니터가 둘이면 그게 다른 화면이라 설정 창은 떠 있는데 아무것도 못 눌렀습니다.

2026.08.11

털뭉이 러시 — 무리 전체가 쏘는 것처럼 보이게

"몇몇만 총을 쏜다"는 피드백이 맞았습니다. 발사가 한 번에 한 발이었고 쏘는 놈을 무작위로 뽑아서, 200마리를 모아도 한 마리가 쏘는 것처럼 보였습니다. 앞줄 사수 여럿이 번갈아 쏘고 총구마다 섬광이 켜지게 했습니다. 무기 티어 6단계도 넣었는데, 인원수는 발사 빈도만 티어는 탄의 모양만 바꾸도록 축을 갈랐습니다.

2026.08.11

털뭉이 러시가 배포 뒤 안 뜨던 것을 고쳤습니다

서비스워커가 HTML 껍데기까지 캐시 우선으로 주고 있었습니다. 껍데기는 해시가 붙은 번들 이름을 가리키는데 새 배포가 옛 해시를 지우므로, 캐시된 껍데기가 사라진 파일을 요청해 게임이 아예 안 떴습니다. 껍데기만 네트워크 우선으로 바꾸고 캐시를 통째로 비웠습니다.

2026.08.10

FPS Arena에 온라인 멀티플레이가 붙었습니다

봇전만 되던 게임을 실제로 연결했습니다. 서버는 중계만 하고 판정은 접속한 사람 중 하나가 맡습니다. 방 목록에서 골라 들어가거나 비밀번호와 초대 코드로 열 수 있고, 한글 방 이름도 됩니다. 사람이 들어오면 봇이 자리를 비켜 줍니다.

2026.08.10

멀티에서 서로가 안 보이던 문제를 고쳤습니다

각자 맵을 따로 뽑고 있어서 6분의 1 확률로만 실제로 만나졌습니다. 어긋난 맵의 높이 차이 때문에 상대가 지형 안에 서 있거나, 예측 보정에 끌려가 무한 낙사에 걸렸습니다. 호스트가 맵을 알리게 고친 뒤 예측 오차 평균이 1.923m에서 0.111m가 됐습니다.

2026.08.10

웹에서 시점이 하늘로 튀던 것과 굳은 키

포인터 잠금이 뱉는 수천 픽셀짜리 이동량 하나가 시점을 605도 돌리고 있었습니다. 상한을 두고 잠금 직후 첫 이벤트를 버리게 했습니다. 브라우저가 잠금을 거절해도 엔진은 잠겼다고 답하던 것, 키가 눌린 채 굳던 것도 같이 고쳤습니다.

2026.08.10

점수판에 사람별 킬·데스·어시

손님은 판정을 안 돌려 팀 점수까지 0:0이었습니다. 호스트가 전적을 실어 보내게 만들면서 어시스트를 새로 넣었습니다. 죽기 전 10초 안에 피해를 준 사람이 대상이고, 막타와 아군 오사는 빠집니다.

2026.08.10

겹침 검사가 드럼통을 못 보고 있었습니다

"여섯 맵 겹침 0쌍"이 거짓 초록불이었습니다. 엄폐물을 가리는 기준이 윗면 0.9m 초과인데 드럼통 윗면이 정확히 0.9라 부두의 열두 개가 통째로 빠져 있었습니다. 미니맵에도 안 뜨고 검사에도 안 잡혔습니다. 통짜 소품에는 "제 몸의 40%" 기준을 함께 적용하도록 고쳤고, 같은 종류를 두 곳 더 찾았습니다.

2026.08.10

총성이 끊기던 것 — 소리 자리가 모자랐습니다

여덟 명이 붙으면 동시에 울려야 하는 소리가 30개를 넘는데 자리가 20개였습니다. 게다가 빈 자리를 두고도 순서가 된 자리를 뺏어서 울리는 중인 총성을 잘랐습니다. 자리를 32개로 늘리고 노는 자리부터 쓰게 했습니다.

2026.08.08

FPS Arena 맵을 56m로 넓히고 소품에 모양을 입혔습니다

컨테이너·상자·방벽·드럼통·파렛트를 블렌더 스크립트로 구워 얹었습니다. 판정은 그대로 상자라 얇은 벽 보장과 되감기 비용이 안 바뀝니다. 실루엣이 생기면서 배관이 건물에 묻혀 있던 것 같은 겹침이 드러나 일곱 곳을 바로잡았고, 미니맵 바닥에는 맵 평면도를 깔았습니다.

2026.08.03

Tiny Knight Rush 정식 출시

Google Play 프로덕션 심사를 통과해 스토어에 올라갔습니다. 이제 누구나 받을 수 있습니다. 비공개 테스트 14일을 채우고 v1.2.46까지 온 끝입니다. 다음은 시즌 랭킹과 도전 과제입니다.

2026.08.03

털뭉이 러시 프로토타입 공개

군중 러너 슈터를 ntsapp.dev/furball 에서 바로 해볼 수 있습니다. 털복숭이 무리가 관문을 지날 때마다 곱해지거나 깎이고, 머릿수가 곧 화력이자 방어력입니다. 캐릭터는 부팅 때 한 번 구운 아틀라스라 2000마리까지 버팁니다.

2026.08.03

강철궤도 웹 빌드를 다른 PC 에서도 되게

emsdk 경로가 이 PC 에 박혀 있어서 다른 기계에서는 빌드가 바로 죽었습니다. 환경변수와 흔한 위치를 차례로 뒤지게 바꾸고, 못 찾으면 설치 방법을 알려주고 멈추게 했습니다. 사내망 TLS 우회도 기본 꺼짐으로 돌려 필요할 때만 켜게 했습니다.

2026.07.31

FFT 바다에 진짜 선체가 올랐습니다

절차적으로 깎던 배를 실측 가능한 선체 모델로 바꾸고, 그 메시를 재서 부력 프로브 14개를 다시 배치했습니다. 폭풍에서 뒤집힌 채 안 돌아오던 문제도 복원 모멘트를 붙여 고쳤습니다. 안내서도 같이 올렸습니다.

2026.07.31

강철궤도 M3 — 소리와 저장이 웹에서도 살아났습니다

브라우저 판에 소리가 붙고 최고 기록과 스크랩이 새로고침을 넘어 남습니다. 함께 테마 4종과 보일러에 템포가 물린 칩튠, 날짜가 곧 시드인 데일리 런, 스크랩으로 사는 영구 강화 5종이 들어갔습니다. 안내서도 같이 올렸습니다.

2026.07.31

FFT 바다 공개

공개된 해양학·그래픽스 기법만으로 처음부터 구현한 실시간 바다를 ntsapp.dev/ocean 에서 바로 볼 수 있습니다. 풍속을 올리면 파고가 물리 공식대로 따라 올라가고, 배는 파면을 따라 흔들립니다. 게임이 아니라 기술 실험입니다.

2026.07.31

강철궤도 프로토타입 공개

달리는 열차 지붕 위를 뛰어다니며 막는 방어 게임을 ntsapp.dev/rail 에서 바로 해볼 수 있습니다. 규칙은 하나입니다. 적이 서 있는 칸에서는 그 칸의 일을 할 수 없습니다.

2026.07.31

낚시일기 지도에 조준점 표시

지도 정중앙에 조준점을 항상 띄웁니다. 지금 보고 있는 화면의 한가운데가 어디인지 알아야 포인트를 정확히 찍을 수 있어서요. 지도 조작은 그대로 통과시키고, 밝은 지형에서도 위성 사진에서도 보이게 흰 헤일로를 넣었습니다.

2026.07.31

Tiny Knight Rush v1.2.46 · 버벅임의 진짜 원인

스웜에서 끊긴다는 제보의 원인이 성능이 아니라 히트스톱 폭주였습니다. 게임 프레임의 43.5%가 시간이 0인 채로 지나가고 있었고, 1.9%로 내렸습니다. 45분 엔딩 보스가 너무 튼튼해진 것도 시간 배율에 상한을 걸어 검증된 값으로 되돌렸습니다.

2026.07.31

Tiny Knight Rush 타이틀 재설계와 칭호

산만하던 타이틀을 패널 구조로 다시 짜고 하위 화면 네 곳의 겹침을 고쳤습니다. 그리고 이 게임 최초로 강해지지 않는 보상인 칭호 9종이 들어갔습니다. 착용하면 이름 앞에 붙고, 조건을 더 이상 만족하지 않으면 조용히 내려갑니다.

2026.07.31

도트 일병 구하기 적 병종 6종

소총병, 저격병, 장교, 기관총 사수, 돌격병, 군견으로 갈랐습니다. 장교는 주변 아군의 반응을 빠르게 하고, 기관총 사수는 선회가 느려 측면이 약점이고, 군견은 냄새로 쫓아서 시야각이 없습니다. 어느 쪽을 먼저 무력화할지가 판단이 됩니다.

2026.07.31

도트 일병 구하기 자세·호흡과 난이도

뛰기·서기·앉기·포복 네 자세가 속도와 발각률과 발소리를 바꾸고, 엎드리면 철조망 밑으로 지나갑니다. 숨을 참으면 조준이 안정되지만 3.5초 뒤 강제로 내쉽니다. 난이도는 적 시야·반응·화력·처형 유예 네 축을 따로 조정합니다.

2026.07.31

스크랩 워, 쿼터뷰에서 횡스크롤로

직접 해보니 부위가 화면에서 겹쳐 조준이 안 됐습니다. 옆에서 보는 시점으로 바꾸니 머리에서 발까지가 화면 세로로 펼쳐집니다. 마우스를 올리면 머리, 내리면 다리를 겨눕니다. 평면이 되면서 점프도 생겼습니다.

2026.07.31

스크랩 워 플레이 피드백 5건 반영

맨손으로 시작하도록 초반 조각을 치우고, 웨이브 사이 휴식을 4.5초에서 9초로 늘려 파츠 회수할 틈을 만들었습니다. 적은 역할별로 도색과 실루엣이 갈리고, 뒤로 걸으며 쏘기만 하는 것도 막았습니다.

2026.07.31

스크랩 워 웹 성능 정리

버벅인다는 말을 듣고 감으로 깎는 대신 먼저 쟀습니다. 조각의 면 수를 줄이고 잔해의 그림자를 끄고 탄 메시를 공유하게 바꿔 드로우콜 551에서 345, 삼각형 258k에서 75k가 됐습니다.

2026.07.31

Little City Story 라벨 겹침 자동 검사

실내 화면 아래쪽에서 두 안내 문구가 겹쳐 뭉개지던 것을 고치고, 같은 일이 다시 생기지 않도록 화면에 떠 있는 모든 라벨의 사각형을 비교해 겹치면 실패시키는 테스트를 넣었습니다. 그 테스트가 HUD 패널이 조이스틱을 덮던 버그를 하나 더 찾아냈습니다.

2026.07.31

스크랩 워 프로토타입 공개

로봇 대전을 ntsapp.dev/robo 에서 바로 해볼 수 있습니다. 적은 체력이 0이 되어 죽는 게 아니라 팔다리를 잃고 못 싸우게 됩니다. 부위 파괴와 열, 현장에서 무기를 주워 무장하는 조달, 역할 4종의 웨이브까지 돌아가는 프로토타입입니다.

2026.07.31

Little City Story 실내 미니게임 100% 커버

방문할 수 있는 실내 25곳 전부에 할 일이 생겼습니다. 미니게임 34종에 메커닉 8종이고, 답이 화면에 없어 찍을 수 없는 계량 방식을 새로 넣었습니다. 점수는 전부 서버가 다시 계산합니다.

2026.07.31

Little City Story 건물 77종으로 확장

방송국, 정수장, 하수처리장, 변전소, 통신 기지국, 지하철역, 공영 주차장, 댐, 태양광 단지, 대학교, 유치원, 요양원, 종합경기장, 컨벤션 센터, 놀이공원을 더했습니다. 지하철은 광역 교통의 여섯 번째 수단이 됐습니다.

2026.07.31

Little City Story 실내 확장과 HUD 정리

학교, 진료소, 도서관, 문화회관, 우체국에 이어 경찰서와 소방서를 따로 나누고 공장, 창고, 군 시설까지 들어갈 수 있게 했습니다. 하단 메뉴가 화면 밖으로 잘리고 HUD가 상단 바를 침범하던 것도 함께 고쳤습니다.

2026.07.31

개인정보처리방침 정비

무엇을 수집하고 무엇을 수집하지 않는지, 브라우저에 남는 값이 무엇인지, 광고를 게재하게 되면 어떤 쿠키가 쓰이고 어떻게 끄는지를 항목별로 다시 적었습니다.

2026.07.31

앱 네 개의 개발기 공개

낚시일기, 낚시대회플랫폼, 벙개벙개, LiquidPvP를 왜 만들었고 무엇으로 만들었는지 글로 정리했습니다. 개발 기록이 11편이 됐습니다.

2026.07.30

낚시 대회 준비물 체크리스트 공개

대회에 나가기 전에 챙길 것을 한 페이지에 모았습니다. 갯바위, 선상, 방파제, 백사장, 민물과 원투 중에서 고르면 해당 항목만 남습니다. 체크한 상태는 브라우저에 남고, 그대로 인쇄하면 종이 체크리스트가 됩니다.

2026.07.30

Little City Story 웹 공개

3D 도시 건설 RPG를 ntsapp.dev/city 에서 바로 플레이할 수 있습니다. 사실상 무한한 지형에 도로와 구역을 놓으면 시민이 이사 오고, 가족의 시간표와 상점의 장부, 날씨와 교통까지 한 도시 안에서 함께 돌아갑니다. 웹 버전은 오프라인 도시로 시작합니다.

2026.07.30

도트 일병 구하기 웹 공개

쿼터뷰 도트 잠입 액션을 ntsapp.dev/mission 에서 바로 플레이할 수 있습니다. 매 판 새로 생성되는 적진에 침투해 포로 3명을 데리고 착륙지대로 복귀하면 임무 성공입니다. 지형 5종이 투입 수단과 침투로를 바꿉니다.

2026.07.27

Tiny Knight Rush HUD 재설계

HUD를 다시 짰습니다. 무기와 패시브는 상단 아이콘 바로 올라가고, 스킬·보호막·궁극기·물약·폭탄은 캐릭터 초상화 둘레에 호로 놓였습니다. 이동하는 손을 떼지 않고 누를 수 있고 발동하면 짧게 진동합니다.

2026.07.27

Tiny Knight Rush v1.2.24 대개편

보스전에 결계가 생겨 잡몹 없이 1:1로 붙습니다. 원형 액션 허브 HUD, 클래스별 보호막·궁극기 7종, 몽크와 네크로맨서 합류, BGM과 클래스별 피격 보이스까지 추가했습니다.

2026.07.22

낚시일기 물고기 사진 배경 자동 제거

도감에 물고기 이미지를 올리면 흰 배경과 격자무늬를 알아서 지워 투명하게 만듭니다. 올릴 때마다 따로 다듬을 필요가 없어졌습니다.

2026.07.15

낚시일기 출조 점수 인사이트

통계 탭에서 출조 점수의 근거를 볼 수 있습니다. 점수만 보여주면 믿을 이유가 없으니, 내가 어떤 조건에서 잘 잡았는지를 같이 보여줍니다.

2026.07.14

낚시일기 아침 물때 알림과 조과 공유 카드

내 조과가 있는 지역을 고르면 매일 아침 물때를 푸시로 보냅니다. 그리고 조과를 이미지 카드로 만들어 그대로 공유할 수 있게 했습니다. 소통 게시판에는 관리자에게만 보이는 비공개 문의도 생겼습니다.

2026.07

게임 세 종 작업 시작

Tiny Knight Rush에 이어 Little City Story와 도트 일병 구하기를 시작했습니다. 이 달부터 만드는 것의 중심이 앱에서 게임으로 옮겨 갔습니다.

2026.07

ntsapp.dev 도메인 준비

그때까지 만든 앱들을 한 주소에 모아 소개할 허브로 ntsapp.dev를 준비했습니다.

2026.06

LiquidPvP 대전 루프 완성

5월 말에 시작한 첫 Unity 프로젝트를 6월 중순까지 붙잡고 핵심 대전 루프를 돌아가게 만들었습니다. 블록깨기 형태의 대전 테트리스입니다.

2026.06

낚시일기 구조 개편

3월에 만든 낚시일기를 다시 손봤습니다. 이후로도 7월까지 계속 업데이트하고 있습니다.

2026.05

LiquidPvP 개발 시작

처음으로 Unity를 잡았습니다. 그때까지 만든 것이 전부 웹 기술이라 씬 구성부터 입력 처리까지 다시 배워야 했습니다.

2026.05

벙개벙개 개발 시작

낚시에서 한 걸음 벗어난 첫 앱입니다. 공통사를 가진 주변 사람들과 부담 없이 이어지는 것을 목표로 잡았고, 대화방에 가장 많은 시간을 썼습니다.

2026.04

낚시대회플랫폼 개발 시작

개인 기록에서 대회 운영으로 넘어갔습니다. 운영자가 다 볼 수 없는 것을 앱이 대신 보게 만드는 것이 목표였습니다.

2026.03

낚시일기 개발 시작

처음 만든 앱입니다. 다녀온 낚시 자리가 기억에만 남아 잊어버리는 것이 싫어서 시작했습니다. 만드는 방법을 하나도 몰라 AI와 검색으로 배워 가며 만들었습니다.