오늘 해낸 것 (2026-07-10)
이 글은 Daily Log 시리즈의 99번째 기록입니다. (총 155개)
오늘 한 일
- Sandrop
- 실시간 순환 컨베이어 벨트 + 엘리베이터 리워크 마무리
- 벨트가 계속 돌고 바스켓이 레인에 실려 도는 실시간 게임 루프, 왼쪽 진입구 장착, 겹침 방지
- 이어하기 대기를 우측 표시로, 탑승 조건(컨베이어+대기 합 < 5) 정리
- “재미없다” 진단에 대한 대수술
- 보드에 벽(통과 불가 칸) 규칙을 추가하고 Dart·Python 엔진 + 공통 fixtures로 동기화
- 레벨 생성기를 무작위 흩뿌리기에서 설계 기반으로 재작성 — 벽 패턴, 매장 깊이, 봇 클리어율 티어(톱니 곡선), 다색 도안
- 레벨 50개 재생성 (클리어 가능 보장 유지)
- 연출·레이아웃 리워크
- 바스켓이 통로를 걸어 나가는 경로 연출, 캔버스로 떨어지는 모래 줄기, 흐르는 벨트 트레드
- 보드를 모래 트레이(굴·바위·양동이)로, 대기 스트립 제거·캔버스 확대로 여백 회수, 웜톤 테마
- 온보딩과 아이템
- 레벨 1 튜토리얼(배너 + 비네팅으로 탭 유도), 레벨 6/7/8 아이템 2개씩 지급 + 버튼 펄스
- 아이템 인벤토리(보유분 우선, 없으면 코인), 사용 불가 시 버튼 비활성화
- 되돌리기가 구조적으로 죽어 있던 버그를 찾아 수정하고, 복귀 바스켓 강조 링으로 효과를 보이게
- HARD/VERY HARD 라벨, 붓기 속도 하향, 걷기 속도 상향, E2E 위젯 테스트 (전체 93개 통과)
- 실시간 순환 컨베이어 벨트 + 엘리베이터 리워크 마무리
- 습관만들기 Pawbit — 슬롯 구매 게이트
- 무료 9칸을 다 채워 10번째 습관이 필요할 때만 상점의 슬롯 광고 버튼이 열리게 함 (빈 슬롯이 남아 있으면 비활성)
- 비활성 사유를 ‘슬롯 여유’(빈 칸 남음)와 ‘내일 다시’(광고 한도)로 구분
- 메트로놈 Simple Metronome — 프리셋 기능
- 지금 BPM·박자표·사운드 설정을 이름 붙여 저장하고, 탭 한 번으로 다시 불러오게 함
- 같은 이름으로 저장하면 덮어쓰기, 행마다 💾 버튼으로 이름 재입력 없이 갱신, 🗑로 삭제
- 프리셋은 늘어날 수 있어 설정 맨 아래로 옮기고, 잘 안 쓰던 BPM 기억 기능은 제거
어려웠던 점
- Sandrop
- 하단 보드가 재미없는 이유를 비주얼 문제로 생각했는데, 파고 보니 레벨 생성이 무작위 흩뿌리기라 퍼즐 구조 자체가 없는 게 뿌리였다. 벽이라는 설계 도구부터 만들어야 했다.
- 난이도 곡선을 숫자로 잡는 게 생각보다 까다로웠다. 측정 봇이 너무 똑똑하면 전부 만점, 너무 멍청하면 전부 빵점이라 밴드가 무의미해진다. 적당히 실수하는 봇이라는 중간 지점을 찾고 나서야 hard/very hard가 의도한 구간에 들어왔다.
- 되돌리기가 뭘 되돌리는지 모르겠다는 의문에서 시작해 파보니, 아예 동작 자체가 불가능한 상태였다. 버튼 활성 조건과 엔진 판정 조건이 서로 모순이라 어떤 순간에도 눌리지 않는 기능이었는데, 에러 없이 조용히 죽어 있어서 지금까지 발견하지 못했다.
- 2~3색 내장 도안으로는 쉬움/보통 티어의 목표 클리어율까지 난이도를 끌어올릴 수 없다는 한계를 확인했다. 색 수를 늘리는 이미지 파이프라인 전까지는 감수하기로 결정.
- Pawbit
- 슬롯 버튼이 꺼지는 이유가 두 개(빈 슬롯이 남음 / 오늘 광고 다 씀)라, 둘이 겹칠 때 어느 메시지를 보여줄지 정해야 했다. 빈 슬롯이 남은 게 더 근본적인 이유라 그쪽을 먼저 보여주게 했다.
- 메트로놈
- 프리셋을 덮어쓸 때마다 같은 이름을 또 타이핑하는 게 번거로웠다. 행마다 저장 버튼을 따로 두는 쪽으로 바꾸니 훨씬 편해졌다.
- 매 마디 첫 박이 살짝 작게 들리는 게 계속 신경 쓰여 다시 손봤지만, 이번에도 안 잡혀서 앱이 아니라 기기 오디오 후처리 쪽 문제로 잠정 결론 냈다.
배운 점
- Sandrop
- 재미는 스킨이 아니라 구조에서 나온다. 겉보기엔 그럴듯 해보이는데 왜 이럴까 하고 살펴보니 구조가 없는 상태. 벽·매장 깊이·통로 설계가 없는 보드는 어떤 비주얼을 입혀도 “아무거나 탭하기”다.
- 난이도 지표는 측정자(봇)의 지능 수준에 따라 완전히 달라진다. 지표를 정할 때는 측정 방법까지 스펙에 못박아야 한다.
- 서로 다른 두 조건(UI 가드와 엔진 판정)이 각각은 합리적이어도 조합하면 항상 거짓일 수 있다. 기능이 에러 없이 죽는 가장 조용한 방식이라, “이거 동작해?”라는 의심이 들면 조건들의 교집합이 존재하는지부터 확인할 것.
- 실시간 시뮬레이션에서 스냅샷 복원은 “그 사이 세계가 변하지 않았을 때”만 안전하다. 복원 불가능한 변화(다른 바스켓의 장착·붓기)를 추적해서 그때는 기능을 막는 게, 총량이 깨진 채 복원하는 것보다 낫다.
- 개발 도중 Claude Code를 Fable 5 모델로 바꿨는데, 그 뒤로 로직·UI·UX 결과물의 완성도가 확실히 올라갔다. 같은 방향을 지시해도 구조를 더 탄탄하게 잡고 연출 디테일까지 챙기는 게 눈에 띄었다.
- (모래게임 Sandrop TIL 1로 정리) 이종 언어 엔진 공통 fixtures / 스냅샷 undo와 inTransit 정합성 / 가드 교집합 공집합 / ε-greedy 봇 난이도 측정 / peel depth / 프로브 캔버스 / 벽 패턴 연결성 검증 / 가중 비복원 추출 / largest remainder 분할 / 열 프론티어 캐시 / 경로 선계산 걷기 / 벨트 공유 위상 / bezier 모래 줄기 / Path.combine 비네팅 / FractionallySizedBox 게이지 / 델타 원장 인벤토리 / pump 가짜 시간 E2E
- (습관만들기 Pawbit TIL 9로 정리) 파생 상태(활성 습관 수 + 구매 슬롯 합성)로 버튼을 켜고 끄기 / 같은 위젯을 재사용하면서 라벨(disabledLabel)로 비활성 사유 분기
- (메트로놈 Simple Metronome TIL 5로 정리) JSON으로 목록 저장 / 이름 upsert / 뷰 동적 생성 / index 클로저 캡처 / ImageView 버튼 / pathData 벡터 아이콘 / weight 헤더 / AlertDialog+EditText / id 유지 타입 변경 / grep으로 기능 안전 제거 / 프리셋 강제 재시작 / 저지연 모드 원복
해야 할 일
- Sandrop — 실기기에서 연출 속도·비네팅·색감 확인, 로프·물음표 기믹, 이미지 양자화 파이프라인, M4 수익화
- 습관만들기 Pawbit — Asset 교체, DEV 패널 최종 삭제, 앱 아이콘/스토어 에셋, 실기기 검증
- 메트로놈 Simple Metronome — 릴리스 준비(버전 올리고 aab 빌드·업로드)
Series: Daily Log
1 | 오늘 해낸 것 2 | 오늘 해낸 것 3 | 오늘 해낸 것 4 | 오늘 해낸 것 5 | 오늘 해낸 것 6 | 오늘 해낸 것 7 | 오늘 해낸 것 8 | 오늘 해낸 것 9 | 오늘 해낸 것 10 | 오늘 해낸 것 11 | 오늘 해낸 것 12 | 오늘 해낸 것 13 | 오늘 해낸 것 14 | 오늘 해낸 것 15 | 오늘 해낸 것 16 | 오늘 해낸 것 17 | 오늘 해낸 것 18 | 오늘 해낸 것 19 | 오늘 해낸 것 20 | 오늘 해낸 것 21 | 오늘 해낸 것 22 | 오늘 해낸 것 23 | 오늘 해낸 것 24 | 오늘 해낸 것 25 | 오늘 해낸 것 26 | 오늘 해낸 것 27 | 오늘 해낸 것 28 | 오늘 해낸 것 29 | 오늘 해낸 것 30 | 오늘 해낸 것 31 | 오늘 해낸 것 32 | 오늘 해낸 것 33 | 오늘 해낸 것 34 | 오늘 해낸 것 35 | 오늘 해낸 것 36 | 오늘 해낸 것 37 | 오늘 해낸 것 38 | 오늘 해낸 것 39 | 오늘 해낸 것 40 | 오늘 해낸 것 41 | 오늘 해낸 것 42 | 오늘 해낸 것 43 | 오늘 해낸 것 44 | 오늘 해낸 것 45 | 오늘 해낸 것 46 | 오늘 해낸 것 47 | 오늘 해낸 것 48 | 오늘 해낸 것 49 | 오늘 해낸 것 50 | 오늘 해낸 것 51 | 오늘 해낸 것 52 | 오늘 해낸 것 53 | 오늘 해낸 것 54 | 오늘 해낸 것 55 | 오늘 해낸 것 56 | 오늘 해낸 것 57 | 오늘 해낸 것 58 | 오늘 해낸 것 59 | 오늘 해낸 것 60 | 오늘 해낸 것 61 | 오늘 해낸 것 62 | 오늘 해낸 것 63 | 오늘 해낸 것 64 | 오늘 해낸 것 65 | 오늘 해낸 것 66 | 오늘 해낸 것 67 | 오늘 해낸 것 68 | 오늘 해낸 것 69 | 오늘 해낸 것 70 | 오늘 해낸 것 71 | 오늘 해낸 것 72 | 오늘 해낸 것 73 | 오늘 해낸 것 74 | 오늘 해낸 것 75 | 오늘 해낸 것 76 | 오늘 해낸 것 77 | 오늘 해낸 것 78 | 오늘 해낸 것 79 | 오늘 해낸 것 80 | 오늘 해낸 것 81 | 오늘 해낸 것 82 | 오늘 해낸 것 83 | 오늘 해낸 것 84 | 오늘 해낸 것 85 | 오늘 해낸 것 86 | 오늘 해낸 것 87 | 오늘 해낸 것 88 | 오늘 해낸 것 89 | 오늘 해낸 것 90 | 오늘 해낸 것 91 | 오늘 해낸 것 92 | 오늘 해낸 것 93 | 오늘 해낸 것 94 | 오늘 해낸 것 95 | 오늘 해낸 것 96 | 오늘 해낸 것 97 | 오늘 해낸 것 98 | 오늘 해낸 것 99 | 오늘 해낸 것 읽는 중 100 | 오늘 해낸 것 101 | 오늘 해낸 것 102 | 오늘 해낸 것 103 | 오늘 해낸 것 104 | 오늘 해낸 것 105 | 오늘 해낸 것 106 | 오늘 해낸 것 107 | 오늘 해낸 것 108 | 오늘 해낸 것 109 | 오늘 해낸 것 110 | 오늘 해낸 것 111 | 오늘 해낸 것 112 | 오늘 해낸 것 113 | 오늘 해낸 것 114 | 오늘 해낸 것 115 | 오늘 해낸 것 116 | 오늘 해낸 것 117 | 오늘 해낸 것 118 | 오늘 해낸 것 119 | 오늘 해낸 것 120 | 오늘 해낸 것 121 | 오늘 해낸 것 122 | 오늘 해낸 것 123 | 오늘 해낸 것 124 | 오늘 해낸 것 125 | 오늘 해낸 것 126 | 오늘 해낸 것 127 | 오늘 해낸 것 128 | 오늘 해낸 것 129 | 오늘 해낸 것 130 | 오늘 해낸 것 131 | 오늘 해낸 것 132 | 오늘 해낸 것 133 | 오늘 해낸 것 134 | 오늘 해낸 것 135 | 오늘 해낸 것 136 | 오늘 해낸 것 137 | 오늘 해낸 것 138 | 오늘 해낸 것 139 | 오늘 해낸 것 140 | 오늘 해낸 것 141 | 오늘 해낸 것 142 | 오늘 해낸 것 143 | 오늘 해낸 것 144 | 오늘 해낸 것 145 | 오늘 해낸 것 146 | 오늘 해낸 것 147 | 오늘 해낸 것 148 | 오늘 해낸 것 149 | 오늘 해낸 것 150 | 오늘 해낸 것 151 | 오늘 해낸 것 152 | 오늘 해낸 것 153 | 오늘 해낸 것 154 | 오늘 해낸 것 155 | 오늘 해낸 것