2026 챌린지 2호- 'Drill Rush' 1개월 대장정의 끝! 스토어 심사시작

Summary
2월 중순부터 3월 8일까지의 작업 내역. UI 대격변, 오토 봇 밸런싱, 그리고 대망의 스토어 출시 준비 완료!
카테고리
Private Projects
Original creation date
생성일
Mar 8, 2026 02:05 PM
태그
drillrush
unity
game
2026년 1년 12개 앱/게임 런칭 프로젝트, 두 번째 타자 'Drill Rush'.
드디어 길고 길었던 1개월간의 개발 대장정이 끝났다. 방금 전, 1인 개발자들의 멘탈을 가장 많이 갉아먹는다는 구글 플레이 콘솔의 '앱 콘텐츠 선언(데이터 보안, 타겟층 등)'과 애드몹(AdMob), GPGS 연동 세팅을 모두 마무리지었다.
이제 유니티에서 뽑아낸 영롱한 .aab 빌드 파일만 스토어에 업로드해서 심사를 넣으면 끝이다. 2월 중순부터 오늘까지, 남은 기간 동안 게임의 퀄리티를 어떻게 끌어올렸는지 마지막 개발 일지를 기록해 둔다. 물론 이것도 바이브 코딩으로 진행하였다. 이 블로그글 역시 내용만 내가 정해서 입력한것을 제미나이가 바로 정리한 내용을 다시 다듬은 글이다.

🎨 1. 비주얼 대격변: "아마추어 티를 벗어보자" (UI & 다이나믹 마을)

초기 프로토타입은 기능은 다 돌아갔지만, 임시 UI 특유의 칙칙함이 남아있었다. 과감하게 게임 전문 GUI 에셋을 도입해 로비와 인게임의 톤앤매너를 싹 갈아엎었다. ⇒ 그러나 픽셀아트와 어울리지않은관계로 탈락. 빠르게 aesprite로 기본 ui 에셋을 만들어서 돌려씀.
  • 다이나믹 로비 (Dynamic Lobby): 유저가 깊은 심도(Depth)를 달성할 때마다 로비 배경이 바뀐다. 처음엔 평범한 지표면 캠프에서 시작하지만, 점점 깊은 얼음 지대, 마그마, 수정 동굴로 배경이 실시간 리스킨되도록 구현했다. 플레이어에게 "내가 이만큼 파고 내려왔구나" 하는 시각적 보상을 확실하게 주고 싶었다.

💎 2. 마이크로 이코노미: "내 소중한 1% 버프가 증발하고 있다고?"

아티팩트 시스템을 20개로 확장하고, '연료 소모 감소', '골드 획득량 증가' 같은 패시브 스탯을 붙였다. 그런데 테스트 도중 아주 치명적인 결함을 발견했다.
[개발자의 생각: 소수점의 마법] 초반 구간에는 광석 하나를 캐도 1~2 골드밖에 안 나온다. 여기서 아티팩트로 '골드 획득량 1% 증가' 버프를 받아봤자, 유니티 내부에서 정수(int)로 변환되면서 소수점이 전부 버려져 사실상 버프가 0%가 되는 현상이 발생했다.
이걸 해결하기 위해 **'보이지 않는 소수점 누적기(Fractional Accumulator)'**를 만들었다. 버려지는 .XX 소수점들을 내부 변수에 묶어두고, 이 값이 1.0을 넘길 때마다 유저에게 1골드씩 추가 보너스로 쏴주게 만들었다. 이제 유저는 단 1%의 버프 수치도 손해 보지 않는다!

🤖 3. 1인 개발의 구원자: "기계가 기계를 테스트하다" (오토 봇 밸런싱)

수십 개의 아티팩트와 업그레이드 확률이 섞이니, 내 손과 머리로는 도저히 밸런스를 잡을 수가 없었다. 그래서 자동으로 게임을 플레이하는 'AutoPlayBot' 컴포넌트를 만들어서 수천 번의 시뮬레이션을 돌렸다.
  • 연료 뷔페 스노우볼 버그: 봇을 돌려보니, 업그레이드가 어느 정도 궤도에 오르면 후반부에는 연료가 떨어지기는커녕 계속 차올라서 '절대 죽지 않는' 무한 생존 버그가 생겼다.
  • 해결책 (Depth Penalty): 심해로 내려갈수록 획득하는 연료량이 선형적으로 깎여서, 최대 70%까지 페널티를 받도록 난이도 곡선을 재설계했다. 이제 후반부로 갈수록 쫄깃한 긴장감이 제대로 살아난다.

🏆 4. 진짜 최종 보스: "개발보다 힘든 스토어 행정 처리"

코딩보다 더 힘들었던 게 바로 플랫폼 연동과 스토어 세팅이었다.
  1. 글로벌 원빌드 소셜 연동: GPGS(안드로이드)와 Game Center(iOS) 로그인을 붙이고, 깊이(100m, 1000m 등)와 마을 해금에 따른 12개의 업적(Achievements)과 리더보드를 연동했다.
  1. 수익화 (AdMob): 글로벌 유저들을 겨냥해 단가를 높여주는 '파트너 입찰(Bidding)' 세팅을 마치고, 실제 라이브 광고 단위 ID로 스위칭을 완료했다.
  1. 구글 플레이 콘솔: 개인정보처리방침 작성부터 데이터 보안(Data Safety) 설문, SHA-1 키스토어 OAuth 연동까지. 온갖 지뢰밭을 뚫고 세팅을 완료했다. (앱 서명 키와 업로드 키가 나뉘어 있다는 함정이 있었다. 지난번 Panic zoo도 그래서 추후 수정을 완료했다. ). 이부분은 12개월도안 계속 반복될 내용이라 정리해서 블로그에 포스팅해둘 필요가있다.

🚀 Next Step: "진인사대천명"

이제 자잘한 메모리 누수나 배경 스크롤 오차(Seam) 버그, CI/CD 환경 에러까지 모조리 다 잡았다. 인게임 BGM과 타격감 넘치는 진동(Haptic)까지 넣고 나니 진짜 '게임' 같아졌다.
한 달 동안 앞만 보고 미친 듯이 달렸다. 이제 .aab 파일을 올리고, 구글의 자비로운(?) 빠른 심사를 기도하는 일만 남았다.
 
설연휴가있어서 2월까지 끝내려고했던 프로젝트가 3월을 넘겼다. 일단 세부적으로 진행했던 기록을 밑에 적어본다. (2월 13일 이후부터의 기록)
 

2026-02-15 ~ 2026-02-22: UI 리소스 교체 및 기반 다지기

🌐 Web/AI (기획)

  • UI 에셋 전면 교체: 기존 임시 UI에서 벗어나, 게임 전문 GUI Casual 에셋 팩을 도입하여 전반적인 아트 퀄리티를 끌어올리기로 기획했습니다. 로비 화면과 인게임의 시각적 통일성을 맞추는 데 주력했습니다.

💻 Local (구현)

  • 에셋 적용: 신규 GUI 에셋을 프로젝트에 임포트하고 낡은 연료 블록 및 로비 씬 UI 구성 요소들을 전면 교체했습니다.
  • 버그 수정: 피버 모드 및 텍스트 이펙트(Gold Text) 등 자잘한 UI 버그를 픽스했습니다.

2026-02-23 ~ 2026-02-25: 수집 시스템(아티팩트) 본격 확장

🌐 Web/AI (기획)

  • 아티팩트 효과 기획: 단순한 수집 용도를 넘어, 유저가 게임을 반복 플레이하며 실질적인 성장 체감을 느낄 수 있도록 아티팩트별 고유 패시브 효과를 설계했습니다.
    • 적용 효과: 연료 소모량 감소, 골드 획득량 증가, 피버 게이지 가속도 증가, 피버 지속시간 연장.

💻 Local (구현)

  • 아티팩트 데이터 추가: 20개의 신규 아티팩트 데이터를 스크립터블 오브젝트(SO)로 추가했습니다.
  • 수치 연동: 게임플레이 로직에 아티팩트 소유 여부 및 스탯 수치를 자동으로 합산하여 반영(UpgradeManagerGameManager)되도록 구현했습니다.
  • UI 폴리싱: 도감(Collection) 팝업의 디테일을 다듬고 아이템 슬롯의 렌더링, 폰트 깨짐 및 UI 픽셀화(Pixelate) 이슈를 픽스했습니다.

2026-02-26 ~ 2026-02-28: 다이나믹 로비(마을) 구현

🌐 Web/AI (기획)

  • 마을 진척도 시스템: 플레이어가 더 깊은 곳까지 뚫고 들어갈수록, 로비(마을)의 배경도 심층부에 맞게 점점 변화하는 시각적 보상을 주도록 기획했습니다. 캠프(Camp) 테마를 시작으로 다양한 심도별 백그라운드를 설계했습니다.

💻 Local (구현)

  • 리소스 연동: 신규 아티팩트 아이콘과 타일/배경(Tile/BG) 리소스를 프로젝트에 추가했습니다.
  • 마을 매니저 업데이트: 조건(Depth)을 달성하여 새로운 마을 구역에 진입할 때마다 로비 배경 타일이 자동으로 리스킨되도록 로직을 작성하고 마을 간 화면 전환 버튼(Arrow)을 추가했습니다.

2026-03-03 ~ 2026-03-04: 자동 밸런싱 및 안드로이드/수익화 포팅

🌐 Web/AI (기획)

  • 자동 밸런스 봇 설계: 수많은 아티팩트와 업그레이드 요소가 겹쳤을 때 게임이 터무니없이 쉬워지거나 어려워지는 것을 막기 위해, 기계가 자동으로 채굴을 시뮬레이션하는 'Auto Bot'을 기획했습니다.
  • 플랫폼 전환 및 수익화: 모바일 시장 진출을 목표로 Android 전용으로 빌드 타겟을 변경하고, 구글 애드몹(AdMob) 기반 광고 수익화 모델(이어하기 리워드, 로비 인터스티셜)을 설계했습니다.

💻 Local (구현)

  • 오토 봇 & 밸런싱: Auto Bot 컴포넌트를 제작하여 실제 플레이 없이도 아티팩트/연료 밸런스를 테스트하고 수치를 튜닝했습니다.
  • 플랫폼 및 광고: 안드로이드로 플랫폼을 스위칭하고, AdManager를 추가하여 리워드 AD 및 전면 광고 로직을 연동했습니다. 구글 앱 아이디 등 메타 데이터를 설정했습니다.
  • UX 대응: 노치 화면 등 다양한 모바일 비율에 대응하기 위해 SafeArea 스크립트를 최초 구현했습니다.
  • 사운드 기반 마련: SoundManager 및 게임 환경설정(Settings) 팝업을 뼈대를 추가하여 볼륨을 조절할 수 있도록 설계했습니다.

2026-03-05 ~ 2026-03-06: 퀄리티 업(QA) 및 디테일 폴리싱

🌐 Web/AI (기획)

  • 몰입감 향상: 청각적/촉각적 피드백 강화를 위해 상황에 맞는 배경음악(BGM)과 효과음(SFX), 기기 진동 햅틱(Haptic) 처리를 세부 기획했습니다.
  • 글로벌 대응: 글로벌 유저를 고려하여 NPC 대사 및 UI 텍스트들의 자동 로컬라이징(다국어 번역) 동적 업데이트 시스템을 설계했습니다.

💻 Local (구현)

  • 사운드/진동 연동: 블록 파괴, 피버 돌입, 재화 획득 시 지정된 오디오 소스가 재생되고 트랩 블록 타격 시에만 진동이 오도록 상세 옵션을 연동했습니다 (설정창 볼륨 저장 연동 포함).
  • 카메라 및 화면 고정: 인게임 씬에서 도중 재시작을 할 때 카메라가 부자연스럽게 스크롤링되며 지하로 내려가는 버그를 고치고(ResetPosition 스냅 적용), 빌드 화면을 세로 모드(Portrait)로 강제 고정했습니다.
  • 로컬라이즈 및 UI 디버그: SpeechBubble에 실시간 언어 변경 콜백(OnLanguageChanged)을 달아 언어를 바꿀 때 즉각 번역 텍스트로 치환 및 크기가 갱신되도록 구현했습니다. 추가로 에디터에서 SafeArea 스크립트가 UI 앵커를 뭉개버리던(OnValidate) 치명적 버그를 픽스했습니다.

2026-03-07: 게임오버 UI, 골드 수치 보정 & 로비 환경 폴리싱

🌐 Web/AI (기획)

  • 최고기록 시각화: 최고 깊이뿐만 아니라 최고 점수(BestScore)도 함께 저장되도록 구조를 넓히고, 게임 오버 창에서 신기록 갱신 시 인지율을 높일 수 있는 텍스트 효과를 고안했습니다.
  • 마이크로 이코노미(소수점 누적): 초반 낮은 재화 획득 구간에서 1% 등 미세한 아티팩트 버프들이 정수형 변환(반올림/버림) 문제로 전부 무시당하는 치명적인 손실 구조를 발견했습니다. 이를 타파하기 위해 '보이지 않는 소수점 누적기(Accumulator)'를 설계했습니다.
  • 디버그 툴 & 로비 동기화: QA 효율을 극대화하기 위한 '아티팩트 전체 해제 치트키'를 기획했으며, 신규 마을 해금 시 로비로 돌아갈 때 배경 화면이 즉각적으로 최신화되지 않는 뷰(View) 상태 비동기화 현상을 파악하고 해결책을 마련했습니다.
  • 배경 이음새 처리: 인게임 스크롤 배경 이미지들 사이에 미세한 틈새(Seam) 픽셀 라인이 보이는 이슈를 파악하고, 무한 스크롤 구조에서의 픽셀 퍼펙트 유지 방안을 진단했습니다.

💻 Local (구현)

  • "BEST" UI 라벨: GameOverView.cs를 수정하여, 이번 판의 기록이 저장된 최고점 및 최대 깊이를 넘어설 경우 텍스트 우측에 반짝이는 금색의 BEST 라벨이 런타임에 동적으로 달라붙도록 구현했습니다. PlayerData.cs에 최고 점수 변수 확장.
  • 골드 내부 누적기: GameManager.cs 의 AddGold 로직을 뜯어고쳐, 최종 산출된 골드량에서 버려지는 .XX 소수점 수치들을 fractionalGoldAccumulator 변수에 묶어두고, 이 값이 1.0을 넘길 때마다 1골드의 추가 보너스 재화를 지급하여 퍼센테이지 효율을 100% 보존했습니다.
  • 디버그 치트 툴 구현: CheatTool.cs 에디터 스크립트를 작성하여 플레이 모드 구동 중 유니티 상단 메뉴 클릭 한번으로 CollectionManager 내의 모든 아티팩트 데이터를 영구 해금 데이터로 치환시켜주는 기능을 구현했습니다.
  • 마을 배경 리로더: VillageManager.cs에 SetVisible 최적화를 부여했습니다. 유저가 플레이 후 죽어서 로비 화면이 켜질 때, PlayerPrefs 내역을 다시 조회하여(Initialize) 해제된 최신 마을이 있는지 검사해 로비 배경 타일맵을 즉각 스위치하도록 뷰 버그를 교정했습니다.
  • 상세 밸런스 점검 & 봇 고도화(Phase 21): AutoPlayBot.cs에 피버 횟수, 섭취 연료량, 봇 차원의 실제 성공률 기록 기능을 추가하여 대규모 밸런스 시뮬레이션을 돌렸습니다. 그 결과 드러난 '연료 뷔페(무한 생존)' 스노우볼 버그를 진단하고 해결하기 위해 Phase21BalanceTool의 패턴 가중치 누적 폭발 오류를 픽스했으며, 초반 0m 구역부터 성능이 낮은 아티팩트가 뜨도록 minStageRequirement를 일괄 0으로 하향 조정했습니다.
  • 심도별 난이도 스케일링 (동적 스폰): BlockManager에 극초반부 아티팩트 등장 확률 구역(0.3%)과 후반부 확률(0.05%) 변수를 나누어 깊이에 따라 선형적으로 보상 확률이 깎이게 만들었으며, Block.cs에서 심해로 갈수록 얻는 연료량이 최대 70%까지 페널티(depthPenalty)를 받도록 설계해 완벽한 후반부 난이도 곡선(Progression)을 구축했습니다.
  • 안드로이드 뒤로가기 & 로비 복귀: 기기의 안드로이드 ESC(Back) 버튼 입력을 UIManager 및 PopupView가 감지하여 열려있는 팝업을 Z-Order 역순으로 하나씩 닫고, 최상단일 경우 게임 종료 확인 팝업을 띄우는 네이티브 UX를 완비했습니다. 인게임에서도 즉각적인 '로비로 돌아가기' 심플 팝업을 추가하며 TimeScale 일시정지와 버튼 상호작용 오디오(SFX)를 통합 연결시켰습니다.
  • 배경 스크롤 보정: BackgroundScroller.cs의 재배치(Leapfrogging) 좌표 계산 코드를 뜯어고쳐, 마을 진입 시 스폰되는 실제 스프라이트 규격(bounds.size.y) 기반으로 동적 높이 처리를 수행하고 0.02f 오버랩을 주어 해상도 플로팅 오차로 인해 발생하던 이미지 간격 픽셀 벌어짐(Seam) 버그를 영구적으로 제거했습니다.

2026-03-08: 소셜 연동, 라이브 수익화 셋업 및 코어 안정화

🌐 Web/AI (기획)

  • 소셜 기능 (GPGS & Game Center): 크로스 플랫폼 소셜 아키텍처를 설계했습니다. 유저의 장기적인 목표 부여를 위해 "최대 깊이(Max Depth)" 리더보드와 마을 해금 및 심도에 따른 12개의 업적(Achievement) 마일스톤을 기획했습니다.
  • 수익화 및 스토어 준비: 구글 애드몹(AdMob) 실제 광고 단위(Ad Unit) 발급을 완료하고, 구글 플레이스토어 앱 등록 및 GPGS 세팅을 확정했습니다.
  • 시스템 안정화 및 빌드 (CI/CD): 메모리 누수(Memory Leak) 추적 및 CI/CD 빌드 서버 환경에서 발생하는 로컬 경로 의존성 에러들을 진단했습니다.

💻 Local (구현)

  • 소셜 플랫폼 매니저:
    • GPGS 플러그인을 활용한 LeaderboardManager.cs 구현. 인스펙터 직렬화 덮어쓰기 오류를 원천 차단하기 위해 GPGSIds.cs의 자동 생성 ID들을 스크립트 단에서 private readonly로 강제 매핑했습니다.
    • 유저가 지하로 파고들 때(IncreaseDepthCheckAchievements를 호출하고, GameOver 시점에 ReportMaxDepth를 전송하도록 시스템을 통합했습니다.
    • 로비(LobbyView)에 리더보드 및 업적 버튼을 추가하고, 소셜 로그인(IsAuthenticated) 성공 시에만 버튼이 노출되도록 동적 UI를 구현했습니다.
  • 수익화 (AdMob): AdManager.cs에 하드코딩된 테스트 ID를 실제 발급받은 라이브 애드몹 광고 단위 ID로 전면 교체했습니다.
  • 메모리 및 퍼포먼스 최적화:
    • FloatingText.cs의 애니메이션 종료 콜백에서 텍스트가 오브젝트 풀(Pool)로 반환되지 않고 단순히 SetActive(false)만 되던 메모리 누수(Memory Leak) 결함을 찾아내 수정(ReturnToPool)했습니다.
    • BackgroundScroller.cs의 리셋 로직(ResetScroller)을 뜯어고쳤습니다. 부활(Revive) 시 배경이 일괄적으로 y=0 좌표로 이동해버리는 현상을 막고, 현재 카메라의 Y 깊이에 맞게 '중앙 배경 타일'을 즉각 스냅(Snap)시켜 저사양 기기나 순간적인 렉에서 솔리드 컬러(Solid Color) 배경이 수 프레임 동안 노출되던 화면 끊김 버그를 완벽히 해결했습니다.
  • CI/CD 빌드 아키텍처 (Config.cs):
    • 배치 빌더(BatchBuilder.cs)가 로컬 PC의 절대 경로(Absolute Path)를 참조해 Jenkins 서버에서 안드로이드 서명 에러가 나던 이슈를 픽스(Application.dataPath 상대경로 동적 할당)했습니다.
    • 런타임 파일 쓰기 에러 방지를 위해 Config.WriteXml() 함수 전체를 #if UNITY_EDITOR 전처리기로 캡슐화했습니다.
    • 빌드 파라미터인 useReporter 옵션을 GameManager의 Awake와 연동시켜, QA 빌드 시에만 에러 리포터(Resources/Reporter) 프리팹이 자동 생성되게끔 제어권을 부여했습니다.