Featured image of post AI로 게임 만들기 #8 — 심해 1,200m까지 내려가서 물고기 27종 도감 채우기 (공개빌드 #8)

AI로 게임 만들기 #8 — 심해 1,200m까지 내려가서 물고기 27종 도감 채우기 (공개빌드 #8)

게임 랩 여덟 번째는 '심해 낚시'. 수면에서 1,200m 심연까지 내려가 물고기를 낚고 27종 도감을 채웁니다. 물고기 27종은 로컬 ComfyUI로 직접 그렸고, 만들고 나서 계속 걸리던 어색함은 감이 아니라 코드에서 원인을 찾아 고쳤어요. 공개빌드 8편.

지난 편의 조차장에 이어, 여덟 번째 게임은 심해 낚시입니다. 수면에서 1,200m 심연까지 내려가 물고기를 낚고, 27종 도감을 채우는 게임이에요.

게임 랩에 처음 생긴 **“모으는 재미”**입니다. 앞의 게임들은 판이 끝나면 기록만 남는데, 이건 잡은 물고기가 영구히 쌓여요.

👉 심해 낚시 직접 하러 가기

어떤 게임이냐면

탭 세 번이면 한 마리입니다.

  • 깊이 정하기 — 움직이는 막대를 탭. 깊을수록 희귀하고 어렵습니다
  • 챔질 — 물고기가 다가와 미끼를 툭툭 건드리다가(가짜) 확 무는 순간
  • 파이팅 — 누르면 감기고, 떼면 풀립니다. 장력을 초록 구간에 두세요

한 판은 캐스팅 12번. 멸치부터 🐉크라켄까지 27종이 있고, 가운데를 잘 유지할수록 정확도 보너스(최대 +85%)가 붙습니다.

도감 — 잡은 물고기는 컬러, 못 잡은 건 실루엣

물고기 27종은 ComfyUI로 직접 그렸다

예전에 노트북에 설치해둔 ComfyUI로 27종을 전부 뽑았습니다. 이번에도 생성이 끝이 아니었어요 — 고래상어는 흰 배경 박스를 달고 나오고, 가오리는 모래바닥까지 딸려왔고, 방어는 두 마리가 겹쳐 나왔습니다.

배경색을 자동 감지해 투명 처리하고, 물체에 딱 맞게 다시 자르고, 그래도 안 되는 건 프롬프트를 바꿔 다시 뽑았어요. ComfyUI가 그려준 걸 게임에 맞게 다듬는 게 절반의 일이라는 게 이번에도 확인됐습니다.

첫 버전은 허공에 대고 챔질하는 것 같았다

일단 돌아가게 만들어놓고 직접 해봤는데, 이상했습니다. 화면엔 줄 하나만 덩그러니 있고, 아무것도 안 보이는데 “지금 탭!“이라는 글자만 떴거든요. 뭘 보고 채라는 건지 알 수가 없었어요.

그래서 물고기를 실제로 보여주기로 했습니다.

  • 물고기가 옆에서 헤엄쳐 다가오고
  • 미끼를 툭툭 건드립니다(찌가 살짝 흔들림 = 가짜 입질)
  • 확 무는 순간 찌가 쑥 들어가고 물보라가 터집니다

이러니 “너무 일찍 채면 실패"라는 규칙이 눈으로 납득되는 규칙이 됐어요. 가짜와 진짜를 구분하는 게 실력이 되고요.

물고기에 검은 배경이 붙은 것 같았는데, 재보니 아니었다

계속 해보니 어떤 물고기는 검은 배경이 붙어 있는 것처럼 보였습니다. 배경 제거가 덜 됐나 싶었죠. 그래서 27종을 전부 계측해봤습니다.

배경이 남은 스프라이트는 하나도 없었습니다. 제가 짚은 원인이 틀렸던 거예요.

진짜 원인은 따로 있었습니다. 물고기와 물의 밝기가 너무 비슷했던 겁니다.

물고기물고기 밝기그 깊이의 물 밝기차이
바다거북1271303
흡혈오징어452025

심해는 물 밝기가 20 아래인데 심해어도 어둡습니다. 검은 배경에 검은 물체였던 거죠.

그래서 바늘에 심해 랜턴을 달았습니다. 미끼 주변을 비추니 물고기가 보이고, 심해 낚시 분위기도 살았어요. 물고기 외곽에 은은한 발광 테두리도 더했고요.

감으로 스프라이트를 다시 뽑았으면 시간만 날렸을 겁니다. 재보니 문제는 완전히 다른 곳에 있었어요.

줄은 그대로인데 물고기만 올라갔다

끌어올릴 때 뭔가 따로 노는 느낌이라 코드를 열어봤더니, 줄 끝이 화면 중앙에 고정돼 있었습니다. 물고기만 위로 움직이니 둘이 분리돼 보인 거예요.

  • 줄 끝을 물고기 입에 고정했습니다. 올라오면 줄도 같이 짧아져요
  • 장력에 따라 줄 모양이 변합니다 — 팽팽하면 직선, 느슨하면 축 처진 곡선, 한계 근처면 붉게 굵어짐
  • 끌어올린 만큼 깊이 숫자도 줄고, 덤으로 물이 밝아집니다

잡은 순간 — 정확도 보너스까지

그래도 뭔가 계속 아쉬웠다 — 세 번째 진단

여기까지 고쳤는데도 뭔가 계속 아쉬웠습니다. 이번엔 감으로 짚지 않고 처음부터 코드를 뒤졌어요. 세 가지가 나왔습니다.

① 물고기가 헤엄치지 않았다. 코드에 회전이 단 한 곳도 없었습니다. 정지 이미지가 미끄러져 다니는 상태였죠. 헤엄칠 때 몸을 기울이고 발버둥칠 때 몸을 확 트는 것만 넣었는데 완전히 달라졌습니다.

② 심해로 가는 여정이 없었다. 하강 코드가 이랬어요.

1
curDepth += Math.max(3, targetDepth*0.012)   // 항상 1.4초

100m든 1,200m든 하강 시간이 똑같았습니다. 심해 낚시인데 심해로 가는 느낌이 0이었죠. 깊이 비례 하강(최대 3.5초)으로 바꾸고, 배경이 위로 흐르게 하고, 200m 황혼대 500m 심해층 900m 심연 이정표가 스쳐 지나가게 했습니다.

③ 줄이 허공에서 시작했다. 배도 수면도 없었어요. 배와 물결을 넣고 줄이 배에서 내려오게 했습니다. 깊어지면 수면이 어둠 속으로 사라지고, 끌어올리면 다시 나타나요.

내려가는 중 — 구간 이정표가 스쳐 지나간다

크기가 무게를 말해준다

물고기 크기를 희귀도 기준으로 잡았더니 1kg 복어가 900kg 고래상어만 하게 보였습니다. 무게(로그) 기준으로 바꾸고, 입질 전에 무게를 미리 굴려서 보이는 크기와 실제 잡는 무게를 일치시켰어요. 이제 화면만 봐도 대물인지 잔챙이인지 압니다.

밀당을 넣었다가 게임을 망칠 뻔했다

마지막에 물고기가 아래로 파고드는 순간(손을 떼고 버텨야 하는)을 넣었습니다. 그런데 시뮬레이션을 돌려보니:

넣기 전넣은 직후
포획률83%33%

포획률이 반토막 났고 파이팅이 교착에 빠져 아예 안 끝나는 경우까지 생겼습니다. 저항력·진행도 손실·발동 횟수를 모두 낮춰 되돌렸어요. 지금은 긴장감만 주고 난이도는 그대로입니다.

이번에도 “재미있을 것 같아서” 넣은 기능이 게임을 망가뜨릴 뻔한 걸 숫자가 잡아줬습니다.

이제 게임 랩이 8개

게임성격
🎨AI 그림 맞히기머리 (퀴즈)
🟩한글 단어 맞히기습관 (데일리)
🍰디저트 탑 쌓기손맛 (아케이드)
🕹️낙하 회피반사신경 (액션)
🗑️종이 농구조준 (물리)
🪐우주 진화최고점 (병합 퍼즐)
🚂조차장논리 (3D 퍼즐)
🎣심해 낚시수집 (도감)

이번 편에서 배운 것

“뭔가 어색하다"는 느낌은 그 자체로는 정보가 아닙니다. 하지만 그 아래엔 항상 구체적인 원인이 있어요. 이번엔 세 번에 걸쳐 파고들었고, 그때마다 코드에서 원인을 찾았습니다 — 회전이 없었고, 하강 시간이 고정이었고, 줄 끝 좌표가 고정이었죠. 전부 한두 줄짜리 원인이었습니다.

그리고 한 번은 제가 짚은 원인이 틀렸어요. “배경 제거가 실패했나?” 싶었는데 재보니 대비 문제였습니다. 고치기 전에 재보는 게 훨씬 빨랐습니다.


심해 낚시 한 판 해보시고 몇 종이나 잡았는지 알려주세요. 저는 아직 크라켄을 못 봤습니다. 🐉

다음 편엔 아홉 번째 게임을 들고 오겠습니다.