보드가 갉아먹히기 시작하자 매치-3가 다른 게임이 됐습니다
매치 시즈는 보드 자체가 전장입니다. 침식이 가장자리부터 칸을 먹어 들어오고, 매치가 그걸 밀어냅니다. 침식 칸을 블록이 아니라 장애물로 정의한 것, 번지기 전에 2.4초를 예고한 것, 이 둘이 게임의 성격을 정했습니다.
앱과 게임을 만들고 고친 과정을 실제 경험 그대로 적습니다. 문제, 이전 상태, 선택한 해결, 결과의 순서로 남기고, 짧은 변경은 아래 릴리스 노트에 둡니다.
매치 시즈는 보드 자체가 전장입니다. 침식이 가장자리부터 칸을 먹어 들어오고, 매치가 그걸 밀어냅니다. 침식 칸을 블록이 아니라 장애물로 정의한 것, 번지기 전에 2.4초를 예고한 것, 이 둘이 게임의 성격을 정했습니다.
규칙은 그대로 두고 그림만 바꿨는데 게임이 달라 보입니다. 귀여움은 색이 아니라 흰 테두리·얼굴·광택·좁은 명도 폭에서 나왔습니다. 보드도 7×7에서 8×8로 넓히고 목표 점수를 다시 잡았습니다.
같은 판이 계속되면 지루해집니다. 매치 시즈에 주기적으로 터지는 사건 네 가지를 넣었습니다. 위협 둘, 기회 둘을 섞어 같은 것이 연달아 나오지 않게 했고, 특수 블록으로 통째로 받아칠 수 있게 설계했습니다.
타이틀 화면, 하트 다섯 개, 닉네임, 서버 순위표, 상태를 따라가는 BGM 세 트랙을 넣었습니다. 하트는 개수와 시각을 같이 저장하면 반드시 어긋나기 때문에 회복 기준 시각 하나만 진실로 두었습니다.
위협 둘과 기회 둘로 시작한 이벤트에 셋을 더 붙였습니다. 선물·컬러밤·중심 침식입니다. 전부 처음부터 나오면 첫 판이 시끄러워서, 판이 오를 때마다 하나씩 열리게 했습니다. 직선 5매치 보상도 폭탄에서 컬러밤으로 바꿨습니다.
압축으로는 못 넘겼습니다. gzip을 걸어도 97MB로 여전히 한도의 네 배였습니다. 조각을 내서 워커가 이어 붙이게 했는데, 한꺼번에 받으면 137MB가 워커 메모리에 얹힙니다.
상의·하의·신발을 부위별로 골라 섞어 입는 시스템을 넣었습니다. 그냥 얹으면 입힌 만큼 그릴 것이 늘어납니다. 실행 중에 한 벌로 합쳐 구워서, 몇 개를 끼워도 표면이 하나만 늘어나게 했습니다.
만들어 둔 게임을 통째로 다시 썼습니다. 기능이 모자라서가 아니라 한 번 고치고 확인하는 데 드는 시간이 길어서 손이 안 갔기 때문입니다. 33커밋으로 처음부터 온라인 대전까지 왔고, 액체 표현은 이참에 셰이더로 다시 만들었습니다.
벙개벙개 대화방에 AI 봇을 붙였습니다. 불러도 아무 말이 없는 경우가 두 가지 있었는데, 하나는 생각하느라 답할 예산을 다 써서였고 하나는 답이 JSON이 아니라 파싱에 실패해서였습니다. 둘 다 오류가 나지 않습니다.
낚시일기 물때 위젯에 실시간 파고와 너울을 붙였습니다. 파향 화살표를 그리고 나서 방향이 이상해 문서와 실측을 둘 다 확인했는데, 데이터가 말하는 각도는 파도가 가는 쪽이 아니라 오는 쪽이었습니다.
평균만 보면 60fps인데 스무 프레임 중 하나가 33ms로 튀면 눈에는 그게 전부입니다. 원인을 찾는 데 계측을 세 번 새로 만들었고, 그 사이 제가 한 번은 원인을 잘못 짚어 글에도 그렇게 적었습니다.
멀티에서 남의 캐릭터를 서버가 보내 준 자리에 그대로 갖다 놓고 있었습니다. 스냅샷은 초당 스무 번 오고 화면은 예순 번 그립니다. 패킷이 늦거나 순서가 뒤바뀌면 지나갔던 자리로 되돌아갑니다.
받아 온 맵 다섯을 붙이고 예전 상자 맵 여섯을 그대로 뒀더니, 무작위로 시작할 때 절반이 옛 맵이었습니다. 여섯을 걷어냈습니다. 그리고 합치기 과정에서 맵 지오메트리 20%가 조용히 사라지고 있었습니다.
우클릭으로 조준하면 총이 화면을 통째로 덮었습니다. 조준 자세 좌표가 상자로 만들던 짧은 총 시절 값이라, 진짜 총 모델을 끼우자 개머리판이 뒤로 뻗어 눈에 박혔습니다. 저격총은 아예 카메라 뒤에 있었습니다.
3D 캐릭터가 복셀보다 프레임 타임이 두 배였습니다. 재질 공유, 그림자 끄기, 원거리 생략, 화면 밖 애니메이션 정지를 넣었고 넷 다 실제로 걸렸습니다. 프레임 타임은 하나도 안 움직였습니다.
3D 캐릭터를 붙였더니 브라우저에서만 블럭 몸으로 나왔고, 고쳤더니 전부 T자세로 걸어 다녔고, 그것도 고쳤는데 여전히 안 움직였습니다. 셋 다 개발 중에는 절대 안 나옵니다. 그리고 제가 "문제 없음"이라고 결론 낸 검사 방법 자체가 틀렸습니다.
코스를 도는 레이싱을 섬에서 섬으로 가는 항해로 바꿨습니다. 나빠지는 날씨, 차오르는 선체, 뒤에 붙는 배는 가려는 곳이 있어야 의미가 생깁니다. 그리고 배수를 공짜에서 배터리를 쓰는 일로 바꾸자 고리가 닫혔습니다.
심사에서 거절당했습니다. 저는 신청해도 되는 상태라고 판단했었고, 판단 근거는 분량이었습니다. 페이지를 재 보니 분량은 문제가 아니었고, 얇은 페이지가 어디에 있느냐가 문제였습니다.
코스 통과를 반경으로 재면 의미 있을 만큼 작은 반경은 관통당할 만큼 작습니다. 그리고 AI 상대에게는 스로틀과 타 두 값만 줬습니다 — 배를 직접 옮기는 순간 그건 드라이버가 아니라 치트가 되기 때문입니다.
상자를 지나가면 먹히는 게 정상인데 40초를 달려도 한 번도 안 먹혔습니다. 원인은 트리거가 아니라 배치였습니다. "레이싱 라인"이라는 게 하나로 있지 않아서, 한 줄로는 어디에 놓아도 맞지 않았습니다.
뉴스와 재무제표를 규칙으로 점수화해 종목을 훑는 도구를 만들었습니다. 매일 아침 스스로 갱신까지 합니다. 그런데 이 점수가 실제로 맞았는지는 아직 아무도 모릅니다 — 성과 추적을 안 만들었기 때문입니다.
굴절 패스에는 최소 크기가 있습니다. 가느다란 물체는 샘플이 죄다 빗나가 물속에서 사라집니다. 10cm 루어를 1m로 키우면 그림은 고쳐지고 게임이 망가지므로, 실제 낚시가 쓰는 답을 그대로 썼습니다.
드랙보다 센 물고기는 줄을 끊지 않고 줄을 가져갑니다. 이 규칙 하나에서 지는 방법 두 가지가 서로 반대로 갈라져 나옵니다. 튜닝하면서 오류를 다섯 개 고쳤는데 전부 실측이 잡아냈습니다.
형태와 색을 다 잡고도 물고기가 장난감처럼 보였습니다. 모든 개체가 공장에서 막 나온 상태였기 때문입니다. 벗겨진 비늘도, 아문 상처도, 갈라진 지느러미도 없었습니다.
1인칭 팔뚝은 거의 전부 카메라 근평면 뒤에 있습니다. 기하는 매번 맞았는데 그려낼 수 있는 부분이 하필 팔처럼 안 보이는 부분이었습니다. 그리고 릴은 커피 통만 했습니다.
"버튼이 안 먹는다"는 제보가 여럿 들어왔는데, 셋 다 막힌 게 아니라 막힌 이유가 안 보이는 것이었습니다. 게임은 거절 사유를 제대로 만들어 두고 아무에게도 안 보이는 곳에 적고 있었습니다.
표를 채우지 않아서 루어의 매력도가 전부 0으로 조회됐고, 매력도 0이면 물고기가 즉시 떠납니다. 참돔도 감성돔도 돌돔도 우럭도 이론상의 존재였습니다. 확인하려고 만든 시뮬레이터는 처음에 제 잘못된 가정 때문에 전부 0을 뱉었습니다.
무리가 200마리든 20마리든 화면에서 총을 쏘는 건 한 마리처럼 보였습니다. 발사가 한 번에 한 발이었고 쏘는 놈을 무작위로 뽑았기 때문입니다. 고치면서 인원수와 무기를 서로 다른 축으로 갈라 놓았습니다.
서비스워커가 모든 요청에 "일단 캐시부터" 정책을 쓰고 있었습니다. HTML 껍데기에는 그게 위험합니다. 껍데기는 해시가 붙은 번들 이름을 가리키는데 배포는 옛 해시를 지우기 때문입니다.
물고기를 넣었더니 돌고래가 그냥 흰 물고기였습니다. 지느러미가 두께 0이었고, 몸통 만드는 방식이 주둥이 있는 형태를 못 만들었고, 광택이 너무 세서 무늬를 통째로 지우고 있었습니다. 물고기가 오직 물을 통해서만 보인다는 사실이 나머지 설계를 거의 다 정했습니다.
수면 아래를 노이즈 섞은 상수 색으로 칠하고 있었습니다. 실제 지형을 굴절시켜 비추도록 바꾸자 물이 가려 주던 결함이 둘 나왔습니다. 그리고 흰 면의 원인을 여섯 번 오진하게 만든 건 렌더링이 아니라 제 검증 도구였습니다.
파도가 부서지는 선을 섬 둘레의 고정된 원으로 잡으면 강풍에서 모래 위에 파도가 부서집니다. 파도는 자기 파고에 견줄 만한 수심에서 부서지므로 그 선은 바다가 정합니다. 그리고 배에는 지형 충돌이 아예 없어서 섬을 뚫고 지나가고 있었습니다.
파도에서 배가 덜 흔들리게 하려고 넣은 항력이 전체 저항의 92%였습니다. 아래위 흔들림 기준으로 크기를 잡은 값을 전 방향에 똑같이 걸었으니 앞으로 가는 것도 그만큼 막혔습니다. 속도를 풀자 느릴 땐 닿지 않던 결함 둘이 드러났습니다.
잡몹이 시원하게 안 죽는다는 요청에 일반 몹 체력만 70%로 낮췄습니다. 같은 시간의 처치 수는 거의 그대로입니다. 처치 속도가 아니라 등장 속도가 상한이기 때문이고, 실제로 바뀌는 건 한 마리당 때리는 횟수입니다.
며칠 전 "여섯 맵 모두 겹침 0쌍"이라고 적었습니다. 제보 스크린샷에는 드럼통이 파란 방벽에 박혀 있었습니다. 검사가 통과한 게 아니라, 검사 대상에서 드럼통 열두 개가 통째로 빠져 있었습니다.
지연보상 코드는 진작 있었는데 부르는 곳이 테스트 한 군데뿐이었습니다. 실제 게임은 모든 사격을 "지금"으로 판정하고 있었습니다. 연결하고 나서도 총알이 통과했는데, 원인은 Godot이 변환을 다음 물리 스텝으로 미루기 때문이었습니다.
멀티 방에 들어가면 아무도 안 보이고, 어떤 사람은 무한 데스에 걸렸습니다. 증상은 둘인데 원인은 하나였습니다. 각자 맵을 따로 뽑고 있었고, 6분의 1 확률로 같은 맵일 때만 실제로 만나졌습니다.
기반 공사만 해 두고 미뤄 뒀던 온라인 멀티플레이를 실제로 연결했습니다. 서버는 중계만 하고 판정은 접속한 사람 중 하나가 전부 돌립니다. 서버에 권위를 주려면 같은 게임을 자바스크립트로 한 번 더 만들어야 했기 때문입니다.
드럼통과 컨테이너를 블렌더 스크립트로 구워 얹었습니다. 판정은 그대로 상자로 두고 겉모습만 바꿨는데, 모양이 생기니까 배관이 건물 한복판에 묻혀 있던 게 눈에 보였습니다. 전부 원래부터 있던 것들이었습니다.
여덟 명이 붙으면 총성이 뚝뚝 끊겼습니다. 소리를 내는 자리를 순서대로 돌려쓰고 있었는데, 비어 있는 자리를 건너뛰지 않고 순서가 된 자리를 그냥 뺏었습니다. 아직 울리는 중인 총성이 그대로 잘렸습니다.
웹에서 시점이 갑자기 하늘로 튀고, 마우스가 화면 밖으로 나가고, 키가 눌린 채 굳었습니다. 넷 다 원인이 달랐지만 공통점이 하나 있었습니다. 브라우저가 알려 주는 값을 검사 없이 믿고 있었다는 것입니다.
교전 중에도 높은 자리를 잡게 하고 포복을 넣었습니다. 그 과정에서 계단 세 개가 애초에 못 올라가는 물건이었다는 걸 알았습니다. 하나는 몇 주째 그 상태였습니다.
화물선 맵에서 20초 동안 총알이 한 발도 안 나갔습니다. 봇은 다 살아 있었고 다 움직이고 있었습니다. 제가 보고 있던 지표로는 이 고장이 절대 안 보였습니다.
봇 일곱이 각자 놀던 걸 분대로 묶었습니다. 정보를 공유하고 역할을 나누게 하자 곧바로 명중률이 25%에서 7%로 떨어졌습니다. 전술을 추가할 때는 그게 기존 규칙과 어떻게 곱해지는지를 먼저 봤어야 했습니다.
폭파 모드를 넣고 검증했더니 같은 맵에서 성공과 실패가 섞여 나왔습니다. 원인을 세 번 짚었고 세 번 다 틀렸습니다. 셋 다 게임이 아니라 테스트 쪽 문제였습니다.
FPS Arena는 맞은 자리가 블럭째 떨어져 나갑니다. 그런데 처음 만든 규칙으로는 그 시스템이 20초에 한 번도 발동하지 않았습니다. 팔다리 체력을 몸 체력에서 떼어내고 나서야 게임이 됐습니다.
조이스틱을 끌면 총이 계속 발사되고, 버튼을 탭하면 화면이 돌고, 글씨는 작아서 안 보였습니다. 원인 셋이 다 달랐고, 공통점은 제가 모바일 화면을 한 번도 안 봤다는 것이었습니다.
FPS Arena를 브라우저에서 돌게 만드는 과정에서 걸린 함정들입니다. 전부 "빌드는 성공했는데 화면이 틀린" 종류였고, 하나는 배포한 뒤에도 한참 동안 원인을 못 찾았습니다.
무리는 알아서 달리고 알아서 쏩니다. 플레이어가 하는 일은 관문에서 어느 칸으로 지나갈지 고르는 것 하나뿐입니다. 그 하나가 왜 계속 어려운지, 그리고 화력이 왜 머릿수에 정비례하지 않는지 정리했습니다.
혼자 하는 게 따분해질 때 근처의 비슷한 사람과 이어지는 앱입니다. 만남을 강요하지 않고, 솔직한 평가를 남길 수 있게 하고, 대화방에 가장 많은 공을 들였습니다.
낚시는 자주 갔는데 어디가 좋았는지는 늘 기억에만 있었습니다. 기억은 지워지니까 기록을 남기기로 했고, 그 기록이 쌓이면서 다음 출조지를 고르는 통계가 됐습니다.
낚시 대회는 공정성이 생명인데 그걸 지켜볼 사람 수는 정해져 있습니다. 대회장 이탈, 조과물 진위, 실시간 순위를 앱이 대신 보게 만든 이야기입니다.
달리는 열차 지붕 위를 뛰어다니며 막는 게임입니다. 규칙은 하나뿐이고 조작은 둘뿐인데, 그 둘이 계속 서로를 방해합니다. 처음 타는 분을 위해 무엇을 보고 무엇을 고르면 되는지 정리했습니다.
LiquidPvP는 블록깨기 형태의 대전 테트리스입니다. 제가 Unity로 처음 만든 프로젝트이기도 해서, 게임 규칙만큼이나 엔진에 익숙해지는 일이 함께 걸려 있었습니다.
Little City Story의 방문 가능한 실내 25곳 전부에 미니게임을 붙였습니다. 게임 34종에 메커닉 8종, 채점은 전부 서버가 합니다. 하루 만에 끝낸 작업이 아니라 하루 만에 구멍을 메운 작업입니다.
도트 일병 구하기의 적은 자기가 아는 것을 말합니다. 느낌표와 물음표, 말풍선, 발각 게이지로요. 병종도 여섯으로 갈라서 어느 부위를 먼저 무력화할지가 판단이 되게 했습니다.
스크랩 워는 체력이 0이 되어 죽는 게임이 아닙니다. 팔다리를 하나씩 잃다가 못 싸우게 되고, 뜯어낸 부위가 그대로 내 부품이 됩니다. 그 한 축에 전리품과 아트와 보스를 전부 물려 놓았습니다.
스크랩 워를 쿼터뷰에서 횡스크롤로 갈아엎었습니다. "컨트롤도 어렵고 총체적 난국"이라는 말을 듣고 원인을 짚어 보니 조작이 아니라 카메라였습니다. 같은 날 성능도 실측해서 드로우콜을 551에서 345로 내렸습니다.
잘 만든 바다 데모를 보고 "이거 어떻게 했지"가 아니라 "이건 무슨 기법이지"에서 시작했습니다. FFT 파랑과 JONSWAP 스펙트럼, 3단 캐스케이드로 처음부터 구현했고, 파고가 물리 공식과 맞는지 픽셀을 읽어 검증했습니다.
브라우저에서 바다를 띄우고 풍속을 올려 보면 파고가 따라 올라갑니다. 그게 눈속임이 아니라 공식이라는 걸 확인하는 방법과, 화면에 있는 것들이 각각 무슨 뜻인지 정리했습니다.
Tiny Knight Rush가 스웜에서 끊긴다는 제보를 받고 성능을 고쳤는데 체감이 없었습니다. 재보니 게임 프레임의 43.5%가 시간이 0인 채로 지나가고 있었습니다. 렌더러는 60fps로 멀쩡히 돌고 있었고, 멈춰 있던 건 세계였습니다.
마크업이 두 벌 있으면 반드시 어긋납니다. 단일 마크업 소스, 쓰인 글자만 굽는 한글 폰트 서브셋, 내용 해시 파일명까지, 이 사이트 자체를 만든 기술적 결정들을 기록합니다.
Little City Story의 거리 풍경은 장식이 아닙니다. 어린이부터 노년까지의 인구 코호트가 시간대별로 누가 어디로 걷는지를 정하고, 이사와 등교와 진료소 방문이 실제 인구 흐름에서 나옵니다.
Little City Story의 WebAssembly 런타임은 파일 하나가 Cloudflare의 업로드 한도를 넘습니다. 큰 파일을 쪼개 원래 주소로 이어 붙이는 Worker를 만들어 ntsapp.dev/city 에서 설치 없이 돌아가게 만든 과정입니다.
도트 일병 구하기의 적은 시야 원뿔로 봅니다. 어디까지 붙어도 되는지를 감이 아니라 화면으로 판단하게 만들고, 들킨 뒤에도 게임이 계속되게 만든 규칙들을 정리했습니다.
밀림에는 헬기로, 사막에는 트럭으로, 강 삼각주에는 반잠수정으로 들어갑니다. 도트 일병 구하기의 지형 5종과 절차 생성이 판마다 다른 침투 계획을 만드는 방법입니다.
Tiny Knight Rush는 끌어서 이동하는 게임입니다. 그런데 버튼을 누르려면 이동을 멈춰야 했습니다. 무기는 상단 바로, 스킬과 소모품은 초상화 둘레의 호로 옮긴 HUD 재설계 이야기입니다.
Tiny Knight Rush의 보스는 잡몹 스웜에 묻혀 보이지도 않았고, 강화가 쌓인 계정 앞에서는 첫 스킬을 쓰기도 전에 죽었습니다. 결계 설계와 계측 기반 밸런스 조정의 기록입니다.
개별 글로 쓰기에는 짧은 변경 기록입니다. 부풀리는 대신 목록으로 보존합니다.
소개를 실제 게임에 맞춰 다시 썼습니다. 캐릭터 열두 명 중 셋을 파티 슬롯에 넣고, 장마다 스테이지 열 개를 에너지를 써서 출격합니다. 돌아오면 골드·균열 파편·기억의 조각 같은 재화로 키우고 의상을 갈아입힙니다. 처음 올릴 때 회색박스 화면밖에 없어 그렇게 적어 뒀는데, 실제 화면을 받아 전부 교체했습니다.
상의·하의·신발을 부위별로 섞어 입는데, 그냥 얹으면 입힌 만큼 그릴 것이 늘어납니다. 파티가 셋이니 곱해지고요. 실행 중에 한 벌로 합쳐 구워서 몇 개를 끼워도 표면이 하나만 늘어납니다. 꾸미라고 만든 시스템이 안 꾸미는 쪽을 권하면 안 됩니다.
파티 셋을 실시간으로 갈아타며 싸우는 쿼터뷰 액션 RPG입니다. ntsapp.dev/monster 에서 바로 해볼 수 있습니다. TAG로 조종 대상을 바꾸고, 나머지 둘은 스스로 싸웁니다. 게임 안에서 얼굴과 체형을 만들고 의상을 갈아입힙니다.
gzip으로는 97.4MB까지밖에 안 줄어 여전히 한도의 네 배였습니다. 패키지를 20MiB 조각 일곱 개로 자르고 워커가 이어 붙입니다. 한꺼번에 받으면 137MB가 워커 메모리에 얹혀서, 한 조각씩 순서대로 받아 흘려보냅니다. 엔진 실행 파일은 압축이 통해 37.7MB가 9.8MB가 됐습니다.
Unity로 만들었던 것을 Godot 4.7.2로 다시 썼습니다. 기능이 모자라서가 아니라 빌드와 반복이 무거워 손이 안 가서였고, 로직과 수치는 옛 프로젝트에서 그대로 옮겼습니다 — 엔진과 규칙을 같이 바꾸면 나중에 뭐가 원인인지 못 가립니다. 33커밋으로 온라인 대전과 안드로이드 빌드까지 왔습니다.
원을 그리고 사이를 이어 붙이던 것을 메타볼 셰이더로 바꿨습니다. 각 칸이 주변에 퍼뜨리는 값을 더해 임계값을 넘는 곳을 칠하면 합쳐지는 모양이 저절로 나오고, 같은 색끼리만 더하니 다른 색은 섞이지 않습니다. 손으로 그리던 넥·블롭·스쿼시 보조 함수가 전부 없어졌습니다.
오가는 데이터를 세어 보니 격자 128자와 염색조 8자, 점수뿐이라 실시간 채널만으로 충분했습니다. P2P를 쓰면 네이티브 확장이 필요한데 얻는 게 없었습니다. 방 번호가 곧 채널 이름이고, 벙개벙개가 쓰던 백엔드를 그대로 씁니다. 그리고 APK를 뜯으면 평문으로 읽히던 접속 정보를 빌드에서 뺐습니다.
이름이나 @로 부르면 답하고, 켜 두면 가끔 먼저 거듭니다. 방마다 성격과 능력을 정하고 실시간 검색·사진 분석을 따로 켤 수 있습니다. 하루 답변 상한을 둬서 명시적으로 불러도 예산을 넘지 않게 했고, 프롬프트에는 "범용 비서가 아니라 이 방의 대화 참가자"라는 울타리를 상시 넣었습니다.
답변 상한 120토큰 중 117을 사고에 쓰고 답이 빈 문자열로 끝나던 것, 그리고 검색을 켜면 응답이 JSON이 아니라 산문으로 오는데 받는 쪽이 JSON만 기다려 멀쩡한 답을 버리던 것. 둘 다 오류가 나지 않아 로그가 깨끗했습니다. 이제 검색이 막히면 검색 없이 다시 불러서, 라이브 정보만 못 줄 뿐 답은 합니다.
물때 위젯에 이름만 붙여 두고 비워 뒀던 "파고" 자리를 채웠습니다. 파고·너울·파주기·파향을 받아 오고, 큰 값 기준 1.0m부터 주의 1.5m부터 위험을 표시합니다. 키가 필요 없는 자료를 골랐습니다 — 유료 구독으로 시작하면 그 구독이 끊기는 날 기능도 끊깁니다.
이 값은 파도가 오는 방향인데 화살표가 그쪽을 가리켜서, 파도가 육지에서 바다로 나가는 것처럼 보였습니다. 문서만 믿지 않고 같은 시각의 풍향과 파향을 세 항구에서 비교했습니다(여수 13°·부산 4°·인천 6° 차이). 화살표는 진행 방향으로 돌리고, 카드에는 오는 방향을 한글 8방위로 함께 적었습니다.
평균 13ms인데 뚝뚝 끊긴다는 제보가 계속 왔습니다. 스무 프레임 중 하나가 33ms로 튀면 눈에는 그게 전부입니다. 봇 아홉이 시야 검사를 같은 프레임에 몰아 하던 것, 합친 메시로 충돌까지 세워 레이 하나가 20만 삼각형을 때리던 것, 그리고 판 도중 2.9초씩 멈추던 셰이더 링크를 잡았습니다. 한국 마을 웹 실측 평균 19.0 → 12.2ms.
멀티에서 남의 캐릭터를 서버가 준 자리에 그대로 갖다 놓고 있었습니다. 스냅샷은 초당 스무 번, 화면은 예순 번이라 뚝뚝 끊기고, 패킷 순서가 뒤바뀌면 지나갔던 자리로 되돌아갑니다. 이제 목표로만 받아 두고 매 프레임 다가갑니다. 되감기 판정용 경로는 즉시 반영이라 따로 뒀습니다.
윈도우 실행 파일을 낼 수 있게 했습니다. 맵은 웹에서 그랬듯 실행 파일 옆 폴더에서 읽습니다. 엔진도 4.7.2로 옮겼고, 조준 자세는 총 길이가 아니라 실제 모델의 윗면과 뒤끝을 재서 잡도록 다시 고쳤습니다 — 같은 길이라도 모델마다 몸통 높이가 달라서 기관단총이 조준점을 덮고 있었습니다.
받아 온 GLB 맵 다섯 옆에 예전 상자 맵 여섯을 그대로 뒀더니, 무작위로 시작할 때 절반이 옛 맵이었습니다. 새 맵을 다섯 개 만들어 놓고 절반만 쓰던 셈이라 여섯을 뺐습니다. 그리고 재질별로 메시를 합칠 때 지오메트리 20%가 조용히 사라지고 있던 것도 고쳤습니다 — 한국 마을이 231,900에서 278,352 삼각형이 되면서 전통 대문과 기와지붕이 돌아왔습니다.
조준 자세 좌표가 상자로 총을 만들던 시절 값이라, 진짜 모델을 끼우자 개머리판이 눈에서 11cm 앞에 섰습니다. 저격총은 아예 카메라 뒤였습니다. 이제 총 길이에서 계산합니다. 판 설정이 두 번 떠서 고른 값이 날아가던 것, 폭파 모드에서 총을 살 수 없던 것도 함께 고쳤습니다.
캐릭터마다 UV가 다르고 한 캐릭터도 몸·머리카락·눈썹이 서로 다른 원본을 써서, 스킨을 원본 텍스처 이름으로 갈아 끼우게 했습니다(여성 6종×12, 남성 9종×9). 무손실이면 226MB라 512px 압축으로 10.8MB까지 줄였습니다. 사이트의 FPS 소개도 다시 썼습니다 — 복셀·맵 6종·"외부 에셋 없음"이 전부 사실이 아니게 돼 있었습니다.
폭파 모드에 크레딧 경제가 들어갔습니다. 킬과 라운드 승패로 벌어 총을 사고, 죽으면 산 총을 잃습니다. 진 팀도 받습니다 — 아무것도 못 받으면 한 번 밀린 팀이 영영 못 따라옵니다. 요원 스킬 셋(연막·섬광·벽)이 붙어 "서로를 먼저 본 쪽이 이긴다"를 사고팔 수 있게 됐고, 판이 끝나면 금화가 남아 옷과 도색을 삽니다.
절차적으로 짓던 여섯에 통째로 받아 오는 다섯(비전 유적·해동 해안·네오 서울·K타워 넥서스·한국 마을)이 더해졌습니다. 다섯을 전부 담으면 첫 화면까지 84MB를 기다려야 해서 고를 때 받습니다. 캐릭터는 복셀 몸에서 3D 모델 18종으로 바뀌었고, 그에 맞춰 앱 소개의 "내려받은 에셋 0"도 사실대로 고쳤습니다.
3D 캐릭터가 브라우저에서만 복셀 몸으로 떨어졌습니다. 폴더 이름 대소문자였는데, 윈도우는 안 가리고 배포 패키지는 가립니다. 고치니 전부 T자세로 걸어 다녔고(폴더를 나열하면 원본이 아니라 껍데기 이름이 나옵니다), 그것도 고쳤는데 여전히 안 움직였습니다(등록 이름에도 껍데기가 붙었습니다). 검사가 "실렸는가"만 묻고 "움직이는가"를 묻지 않아 전부 통과하고 있었습니다.
평면 그림은 UV와 안 맞아 그냥 못 씁니다. T자세 앞뒤 두 장을 모델에 쏘아 붙인 뒤 원래 UV로 다시 구워, UV 배치를 몰라도 옷이 붙게 했습니다. 여섯 캐릭터에 각각 다른 의상이 들어갑니다. 무기 6종도 새 모델로 갈았고, 원화 작업 폴더가 배포에 섞여 있어 빼면서 웹 전송량이 49.3MB에서 24.5MB가 됐습니다.
애드센스 대응으로 얇은 페이지를 고친 뒤 다시 재다가, 게임 경로 아홉 개가 본문 7~391자인데 전부 색인이 열려 있는 것을 발견했습니다. 화면 전체가 캔버스라 읽을 글자가 로딩 문구뿐입니다. robots.txt로 막았습니다 — 게임은 각자 다른 워커가 서빙해서 Pages 헤더가 닿지 않기 때문입니다. 실제 소개 문서인 /tiny/ 와 /fps/ 는 열어 뒀습니다.
코스를 도는 레이싱을 섬에서 섬으로 가는 항해로 바꿨습니다. 원에는 목적지가 없어서, 나빠지는 날씨도 차오르는 선체도 랩타임 손해일 뿐이었습니다. 배수를 공짜에서 배터리를 쓰는 일로 바꾸자 고리가 닫혔습니다 — 거친 물은 쫓는 배를 떨구지만 선체를 채우고, 펌프는 배터리를 쓰고, 배터리가 죽으면 레이더가 함께 죽습니다. 접속하지 않은 동안에도 배가 갑니다.
3D 캐릭터가 복셀보다 프레임 타임이 두 배였습니다. 재질 공유·그림자 끄기·원거리 생략·화면 밖 정지를 넣었고 넷 다 실제로 걸렸는데 프레임 타임은 안 움직였습니다. 하나씩 통째로 꺼 보니 남는 값이 전부 그리는 횟수였고, 부위별로 나뉜 메시를 합쳐 절반 가까이 줄였습니다. 3인칭 시점과 상체 조준도 함께 붙였습니다.
등장 일정이 문자 그대로 초당 한 마리로 시작하고 있었습니다. 웨이브 최소치를 3으로 두고 간격을 줄여 초반이 초당 다섯 마리로 열립니다. 1분 시점 처치 수가 64에서 330이 됐습니다. 후반은 이미 상한에 묶여 있어 거의 그대로입니다. 핵 아이콘이 물약과 8픽셀에서 같은 그림이던 것도 버섯구름으로 바꿨습니다.
물색과 식생, 바위를 남해 쪽으로 다시 잡았습니다. 소나무와 화강암, 맑은 열대 해수 대신 남해 물색입니다. 하늘 조도 계산을 한 곳으로 모으고 노출 규약을 통일했으며, 오래 남아 있던 미해결 항목 두 개는 다시 재서 정정했습니다.
심사에서 「가치가 별로 없는 콘텐츠」로 거절당했습니다. 재 보니 분량이 아니라 얇은 페이지의 위치가 문제였습니다. 검색창뿐인 127자 페이지가 색인 대상이었고, 정작 스토어에 출시한 앱 넷의 소개가 가장 얇았습니다. 읽을 것이 없는 페이지는 색인에서 빼고, 출시작 소개는 화면 사진과 함께 다시 썼습니다.
FFT 바다 엔진에서 갈라져 나온 레이싱입니다. ntsapp.dev/racing 에서 볼 수 있습니다. 코스는 씨앗 하나에서 생성되고, 게이트 통과는 반경이 아니라 평면 교차로 판정합니다 — 반경으로 재면 빠른 배가 그냥 뚫고 지나갑니다. AI 상대는 사람과 똑같이 스로틀과 타 두 값만 만집니다.
뉴스와 재무제표를 규칙으로 점수화해 종목을 훑는 리서치 보조 도구입니다. 매일 아침 GitHub Actions가 스스로 갱신합니다. 다만 성과 추적이 없어 이 점수가 실제로 맞았는지는 검증되지 않았습니다. 투자 추천이 아니고, 개인용을 전제로 만들어 검색 색인에서는 빼 뒀습니다.
루어의 어종별 매력도 표를 채우지 않아 전부 0으로 조회됐고, 매력도 0이면 물고기가 즉시 떠납니다. 참돔도 감성돔도 돌돔도 우럭도 이론상의 존재였습니다. 채비 11개 × 어종 19종을 누락 0으로 채우고, 미끼와 밑밥을 넣었습니다. 실제 입질 엔진을 그대로 돌리는 시뮬레이터로 루어별 서열까지 확인했습니다.
"버튼이 안 먹는다"는 제보 셋이 전부 같은 모양이었습니다. 막힌 게 맞는데 막힌 이유가 안 보였습니다. 거절 사유를 낚시 중에는 숨겨지는 패널에 적고 있었고, 좌초는 매 프레임 계산해 놓고 아무도 읽지 않았습니다. 조타 잠금도 낚싯대를 든 것이 아니라 줄이 나간 것에 다시 묶었습니다.
알파벳 키 아홉 개로만 되던 조작을 아이콘 버튼으로 옮겼습니다. 이동과 스페이스는 키에 남겼습니다 — 누른 채로 있고 다른 데를 보면서 쓰는 조작이라 버튼이 더 나쁩니다. 장비는 실물 치수로 다시 쟀습니다. 3000번 릴 몸통이 55mm인데 68mm로 들어가 있었습니다.
FFT 바다 엔진에서 갈라져 나온 보트 낚시입니다. ntsapp.dev/fishing 에서 바로 해볼 수 있습니다. 캐스팅부터 입질, 파이팅, 랜딩까지 한 바퀴가 돌아갑니다. 바다와 물속과 섬은 그대로 물려받았고 그 위에 낚시 규칙과 어체 12종을 새로 얹었습니다.
수중을 상수 색으로 칠하던 것을 굴절 패스로 바꿨습니다. 바다와 하늘을 뺀 씬을 따로 그린 뒤 물 셰이더가 화면 좌표를 굴절시켜 읽습니다. 물기둥 두께는 가정하지 않고 깊이로 재기 때문에 외해에서는 광로가 길어져 항이 스스로 사라집니다. 그 위에 돌고래·상어·열대어가 얹혔습니다.
프로브 항력이 전체 저항의 92%를 차지하며 전진까지 묶고 있었습니다. 히브와 롤을 잡으려고 저면적 기준으로 크기를 잡은 항이라 전후 방향에는 과대했습니다. 속도가 오르자 느릴 땐 닿지 못하던 결함 둘이 드러나 함께 고쳤습니다 — 피치 69도로 영구 고착되던 것과, 선수가 처박혀도 추력이 계속 나오던 것입니다.
쇄파선을 고정된 원이 아니라 파고로 정해지는 수심 등고선으로 잡았습니다. 미풍이면 수심 1.5m 부근, 강풍이면 8m까지 밀려납니다. 배에는 지형 접촉이 아예 없어 섬을 뚫고 지나갔는데, 부력과 같은 프로브에 접촉을 걸어 완만한 해변에는 선수부터 얹히게 했습니다.
일반 몹의 체력을 70%로 낮췄습니다. 정예 판정 이후에 적용해서 정예 배수와 보스 곡선은 건드리지 않습니다. 같은 시간의 처치 수는 거의 그대로인데(1211→1248) 처치 속도가 아니라 등장 속도가 상한이기 때문이고, 실제로 바뀌는 것은 한 마리당 때리는 횟수로 30% 줄어듭니다.
일시정지에서 판 설정으로 갈 때 포인터를 다시 잠갔다가 곧바로 푸는 왕복이 있었습니다. 웹에서 잠금을 풀면 커서가 브라우저가 정한 자리로 돌아가는데, 모니터가 둘이면 그게 다른 화면이라 설정 창은 떠 있는데 아무것도 못 눌렀습니다.
"몇몇만 총을 쏜다"는 피드백이 맞았습니다. 발사가 한 번에 한 발이었고 쏘는 놈을 무작위로 뽑아서, 200마리를 모아도 한 마리가 쏘는 것처럼 보였습니다. 앞줄 사수 여럿이 번갈아 쏘고 총구마다 섬광이 켜지게 했습니다. 무기 티어 6단계도 넣었는데, 인원수는 발사 빈도만 티어는 탄의 모양만 바꾸도록 축을 갈랐습니다.
서비스워커가 HTML 껍데기까지 캐시 우선으로 주고 있었습니다. 껍데기는 해시가 붙은 번들 이름을 가리키는데 새 배포가 옛 해시를 지우므로, 캐시된 껍데기가 사라진 파일을 요청해 게임이 아예 안 떴습니다. 껍데기만 네트워크 우선으로 바꾸고 캐시를 통째로 비웠습니다.
봇전만 되던 게임을 실제로 연결했습니다. 서버는 중계만 하고 판정은 접속한 사람 중 하나가 맡습니다. 방 목록에서 골라 들어가거나 비밀번호와 초대 코드로 열 수 있고, 한글 방 이름도 됩니다. 사람이 들어오면 봇이 자리를 비켜 줍니다.
각자 맵을 따로 뽑고 있어서 6분의 1 확률로만 실제로 만나졌습니다. 어긋난 맵의 높이 차이 때문에 상대가 지형 안에 서 있거나, 예측 보정에 끌려가 무한 낙사에 걸렸습니다. 호스트가 맵을 알리게 고친 뒤 예측 오차 평균이 1.923m에서 0.111m가 됐습니다.
포인터 잠금이 뱉는 수천 픽셀짜리 이동량 하나가 시점을 605도 돌리고 있었습니다. 상한을 두고 잠금 직후 첫 이벤트를 버리게 했습니다. 브라우저가 잠금을 거절해도 엔진은 잠겼다고 답하던 것, 키가 눌린 채 굳던 것도 같이 고쳤습니다.
손님은 판정을 안 돌려 팀 점수까지 0:0이었습니다. 호스트가 전적을 실어 보내게 만들면서 어시스트를 새로 넣었습니다. 죽기 전 10초 안에 피해를 준 사람이 대상이고, 막타와 아군 오사는 빠집니다.
"여섯 맵 겹침 0쌍"이 거짓 초록불이었습니다. 엄폐물을 가리는 기준이 윗면 0.9m 초과인데 드럼통 윗면이 정확히 0.9라 부두의 열두 개가 통째로 빠져 있었습니다. 미니맵에도 안 뜨고 검사에도 안 잡혔습니다. 통짜 소품에는 "제 몸의 40%" 기준을 함께 적용하도록 고쳤고, 같은 종류를 두 곳 더 찾았습니다.
여덟 명이 붙으면 동시에 울려야 하는 소리가 30개를 넘는데 자리가 20개였습니다. 게다가 빈 자리를 두고도 순서가 된 자리를 뺏어서 울리는 중인 총성을 잘랐습니다. 자리를 32개로 늘리고 노는 자리부터 쓰게 했습니다.
컨테이너·상자·방벽·드럼통·파렛트를 블렌더 스크립트로 구워 얹었습니다. 판정은 그대로 상자라 얇은 벽 보장과 되감기 비용이 안 바뀝니다. 실루엣이 생기면서 배관이 건물에 묻혀 있던 것 같은 겹침이 드러나 일곱 곳을 바로잡았고, 미니맵 바닥에는 맵 평면도를 깔았습니다.
Google Play 프로덕션 심사를 통과해 스토어에 올라갔습니다. 이제 누구나 받을 수 있습니다. 비공개 테스트 14일을 채우고 v1.2.46까지 온 끝입니다. 다음은 시즌 랭킹과 도전 과제입니다.
군중 러너 슈터를 ntsapp.dev/furball 에서 바로 해볼 수 있습니다. 털복숭이 무리가 관문을 지날 때마다 곱해지거나 깎이고, 머릿수가 곧 화력이자 방어력입니다. 캐릭터는 부팅 때 한 번 구운 아틀라스라 2000마리까지 버팁니다.
emsdk 경로가 이 PC 에 박혀 있어서 다른 기계에서는 빌드가 바로 죽었습니다. 환경변수와 흔한 위치를 차례로 뒤지게 바꾸고, 못 찾으면 설치 방법을 알려주고 멈추게 했습니다. 사내망 TLS 우회도 기본 꺼짐으로 돌려 필요할 때만 켜게 했습니다.
절차적으로 깎던 배를 실측 가능한 선체 모델로 바꾸고, 그 메시를 재서 부력 프로브 14개를 다시 배치했습니다. 폭풍에서 뒤집힌 채 안 돌아오던 문제도 복원 모멘트를 붙여 고쳤습니다. 안내서도 같이 올렸습니다.
브라우저 판에 소리가 붙고 최고 기록과 스크랩이 새로고침을 넘어 남습니다. 함께 테마 4종과 보일러에 템포가 물린 칩튠, 날짜가 곧 시드인 데일리 런, 스크랩으로 사는 영구 강화 5종이 들어갔습니다. 안내서도 같이 올렸습니다.
공개된 해양학·그래픽스 기법만으로 처음부터 구현한 실시간 바다를 ntsapp.dev/ocean 에서 바로 볼 수 있습니다. 풍속을 올리면 파고가 물리 공식대로 따라 올라가고, 배는 파면을 따라 흔들립니다. 게임이 아니라 기술 실험입니다.
달리는 열차 지붕 위를 뛰어다니며 막는 방어 게임을 ntsapp.dev/rail 에서 바로 해볼 수 있습니다. 규칙은 하나입니다. 적이 서 있는 칸에서는 그 칸의 일을 할 수 없습니다.
지도 정중앙에 조준점을 항상 띄웁니다. 지금 보고 있는 화면의 한가운데가 어디인지 알아야 포인트를 정확히 찍을 수 있어서요. 지도 조작은 그대로 통과시키고, 밝은 지형에서도 위성 사진에서도 보이게 흰 헤일로를 넣었습니다.
스웜에서 끊긴다는 제보의 원인이 성능이 아니라 히트스톱 폭주였습니다. 게임 프레임의 43.5%가 시간이 0인 채로 지나가고 있었고, 1.9%로 내렸습니다. 45분 엔딩 보스가 너무 튼튼해진 것도 시간 배율에 상한을 걸어 검증된 값으로 되돌렸습니다.
산만하던 타이틀을 패널 구조로 다시 짜고 하위 화면 네 곳의 겹침을 고쳤습니다. 그리고 이 게임 최초로 강해지지 않는 보상인 칭호 9종이 들어갔습니다. 착용하면 이름 앞에 붙고, 조건을 더 이상 만족하지 않으면 조용히 내려갑니다.
소총병, 저격병, 장교, 기관총 사수, 돌격병, 군견으로 갈랐습니다. 장교는 주변 아군의 반응을 빠르게 하고, 기관총 사수는 선회가 느려 측면이 약점이고, 군견은 냄새로 쫓아서 시야각이 없습니다. 어느 쪽을 먼저 무력화할지가 판단이 됩니다.
뛰기·서기·앉기·포복 네 자세가 속도와 발각률과 발소리를 바꾸고, 엎드리면 철조망 밑으로 지나갑니다. 숨을 참으면 조준이 안정되지만 3.5초 뒤 강제로 내쉽니다. 난이도는 적 시야·반응·화력·처형 유예 네 축을 따로 조정합니다.
직접 해보니 부위가 화면에서 겹쳐 조준이 안 됐습니다. 옆에서 보는 시점으로 바꾸니 머리에서 발까지가 화면 세로로 펼쳐집니다. 마우스를 올리면 머리, 내리면 다리를 겨눕니다. 평면이 되면서 점프도 생겼습니다.
맨손으로 시작하도록 초반 조각을 치우고, 웨이브 사이 휴식을 4.5초에서 9초로 늘려 파츠 회수할 틈을 만들었습니다. 적은 역할별로 도색과 실루엣이 갈리고, 뒤로 걸으며 쏘기만 하는 것도 막았습니다.
버벅인다는 말을 듣고 감으로 깎는 대신 먼저 쟀습니다. 조각의 면 수를 줄이고 잔해의 그림자를 끄고 탄 메시를 공유하게 바꿔 드로우콜 551에서 345, 삼각형 258k에서 75k가 됐습니다.
실내 화면 아래쪽에서 두 안내 문구가 겹쳐 뭉개지던 것을 고치고, 같은 일이 다시 생기지 않도록 화면에 떠 있는 모든 라벨의 사각형을 비교해 겹치면 실패시키는 테스트를 넣었습니다. 그 테스트가 HUD 패널이 조이스틱을 덮던 버그를 하나 더 찾아냈습니다.
로봇 대전을 ntsapp.dev/robo 에서 바로 해볼 수 있습니다. 적은 체력이 0이 되어 죽는 게 아니라 팔다리를 잃고 못 싸우게 됩니다. 부위 파괴와 열, 현장에서 무기를 주워 무장하는 조달, 역할 4종의 웨이브까지 돌아가는 프로토타입입니다.
방문할 수 있는 실내 25곳 전부에 할 일이 생겼습니다. 미니게임 34종에 메커닉 8종이고, 답이 화면에 없어 찍을 수 없는 계량 방식을 새로 넣었습니다. 점수는 전부 서버가 다시 계산합니다.
방송국, 정수장, 하수처리장, 변전소, 통신 기지국, 지하철역, 공영 주차장, 댐, 태양광 단지, 대학교, 유치원, 요양원, 종합경기장, 컨벤션 센터, 놀이공원을 더했습니다. 지하철은 광역 교통의 여섯 번째 수단이 됐습니다.
학교, 진료소, 도서관, 문화회관, 우체국에 이어 경찰서와 소방서를 따로 나누고 공장, 창고, 군 시설까지 들어갈 수 있게 했습니다. 하단 메뉴가 화면 밖으로 잘리고 HUD가 상단 바를 침범하던 것도 함께 고쳤습니다.
무엇을 수집하고 무엇을 수집하지 않는지, 브라우저에 남는 값이 무엇인지, 광고를 게재하게 되면 어떤 쿠키가 쓰이고 어떻게 끄는지를 항목별로 다시 적었습니다.
낚시일기, 낚시대회플랫폼, 벙개벙개, LiquidPvP를 왜 만들었고 무엇으로 만들었는지 글로 정리했습니다. 개발 기록이 11편이 됐습니다.
대회에 나가기 전에 챙길 것을 한 페이지에 모았습니다. 갯바위, 선상, 방파제, 백사장, 민물과 원투 중에서 고르면 해당 항목만 남습니다. 체크한 상태는 브라우저에 남고, 그대로 인쇄하면 종이 체크리스트가 됩니다.
3D 도시 건설 RPG를 ntsapp.dev/city 에서 바로 플레이할 수 있습니다. 사실상 무한한 지형에 도로와 구역을 놓으면 시민이 이사 오고, 가족의 시간표와 상점의 장부, 날씨와 교통까지 한 도시 안에서 함께 돌아갑니다. 웹 버전은 오프라인 도시로 시작합니다.
쿼터뷰 도트 잠입 액션을 ntsapp.dev/mission 에서 바로 플레이할 수 있습니다. 매 판 새로 생성되는 적진에 침투해 포로 3명을 데리고 착륙지대로 복귀하면 임무 성공입니다. 지형 5종이 투입 수단과 침투로를 바꿉니다.
HUD를 다시 짰습니다. 무기와 패시브는 상단 아이콘 바로 올라가고, 스킬·보호막·궁극기·물약·폭탄은 캐릭터 초상화 둘레에 호로 놓였습니다. 이동하는 손을 떼지 않고 누를 수 있고 발동하면 짧게 진동합니다.
보스전에 결계가 생겨 잡몹 없이 1:1로 붙습니다. 원형 액션 허브 HUD, 클래스별 보호막·궁극기 7종, 몽크와 네크로맨서 합류, BGM과 클래스별 피격 보이스까지 추가했습니다.
도감에 물고기 이미지를 올리면 흰 배경과 격자무늬를 알아서 지워 투명하게 만듭니다. 올릴 때마다 따로 다듬을 필요가 없어졌습니다.
통계 탭에서 출조 점수의 근거를 볼 수 있습니다. 점수만 보여주면 믿을 이유가 없으니, 내가 어떤 조건에서 잘 잡았는지를 같이 보여줍니다.
내 조과가 있는 지역을 고르면 매일 아침 물때를 푸시로 보냅니다. 그리고 조과를 이미지 카드로 만들어 그대로 공유할 수 있게 했습니다. 소통 게시판에는 관리자에게만 보이는 비공개 문의도 생겼습니다.
Tiny Knight Rush에 이어 Little City Story와 도트 일병 구하기를 시작했습니다. 이 달부터 만드는 것의 중심이 앱에서 게임으로 옮겨 갔습니다.
그때까지 만든 앱들을 한 주소에 모아 소개할 허브로 ntsapp.dev를 준비했습니다.
5월 말에 시작한 첫 Unity 프로젝트를 6월 중순까지 붙잡고 핵심 대전 루프를 돌아가게 만들었습니다. 블록깨기 형태의 대전 테트리스입니다.
3월에 만든 낚시일기를 다시 손봤습니다. 이후로도 7월까지 계속 업데이트하고 있습니다.
처음으로 Unity를 잡았습니다. 그때까지 만든 것이 전부 웹 기술이라 씬 구성부터 입력 처리까지 다시 배워야 했습니다.
낚시에서 한 걸음 벗어난 첫 앱입니다. 공통사를 가진 주변 사람들과 부담 없이 이어지는 것을 목표로 잡았고, 대화방에 가장 많은 시간을 썼습니다.
개인 기록에서 대회 운영으로 넘어갔습니다. 운영자가 다 볼 수 없는 것을 앱이 대신 보게 만드는 것이 목표였습니다.
처음 만든 앱입니다. 다녀온 낚시 자리가 기억에만 남아 잊어버리는 것이 싫어서 시작했습니다. 만드는 방법을 하나도 몰라 AI와 검색으로 배워 가며 만들었습니다.