알림 하나 때문에 태블릿으로 옮겼다 | 디지몬 육성기 개발일지 7화
디지몬 육성기 개발일지 · 7화
알림 하나 때문에 태블릿으로 옮겼다
이 게임을 PC로 만들고 안드로이드로까지 옮긴 이유를 사람들은 보통 "여러 기기에서 하고 싶어서"라고 생각한다. 나는 아니었다. 이유는 하나였다.
"애초에 PC/APK로 이식하려고 한 것 자체가 알람이 오지 않는게 답답해서였어. PC야 화면 한쪽에 켜놓으면 눈으로 보이기라도 하지만 앱 버젼은 잠금화면이나 앱을 꺼놓으면 보기도 힘들어서 무조건 육성 실패로 이어져. 알림은 가장 중요한 부분이야."
01이번 사흘의 할 일
이번 화는 사흘이다. 중간의 며칠은 손을 아예 못 댔다.
첫날은 배포와 아무 상관 없어 보이는 일을 했다. 레벨업 애니메이션이다. 퀘스트에서 경험치를 받고 나면 숫자가 오르는 장면이 나와야 하는데, 그 장면이 몇 틱짜리인지까지 직접 정해서 넘겼다. 0번과 1번 그림을 0, 1, 0, 1, 0, 1 순서로 4틱. 그 다음 레벨업 글자가 점멸하는데 그것도 4틱. 오른쪽에 도달한 레벨 숫자가 들어간다.
그리고 나흘 뒤 새벽 1시, 다시 앉아서 처음 한 말이 이거였다. "Lv 표시하는 부분도 전부 다 0.25초 출력이야? 마지막은 0.5초였으면 좋겠는데." 그 새벽은 열한 시간 반을 갔고, 끝날 때쯤에는 게임이 배포되어 있었다.
새벽 2시 14분에 이렇게 물었다. "이제 슬슬 배포를 할까 하는데 아직 개발 안된 부분이 있나?" 거기서부터는 목록 지우기였다. 안 만든 기능, 실물기로 확인 못 한 수치, 컷인이 빠진 디지몬. 하나씩 보고 고칠 건 고치고, 못 고칠 건 "나중에 한번에 수정하든 하자"로 넘겼다.
배포용으로 바꾼 건 네 가지였다. 실행할 때 게임 엔진 로고가 안 뜨게 하고, 버전을 0.1로 붙이고, 트레이 메뉴에 한국어·영어 전환을 넣고, 아이콘을 알 스프라이트로 바꿨다. 하나 더 있었다. "배포용 프로그램에는 디버그 넣지 않을거야." 개발하면서 쓰던 F1 패널은 배포본에서 통째로 빠졌다.
02잘 안된 것
배포는 오전에 끝났다. 그날 오후에 안드로이드로 옮기기 시작했고, 그 다음 날 새벽 4시 27분에 이 말을 보냈다.
"apk에서 프로그램을 끄면 알림이 안나와"
게임 자체는 태블릿에서 잘 돌았다. 화면도 맞고 터치도 되고 세이브도 남았다. 그런데 앱을 내리면 아무 소식이 없었다. 30분 뒤에 다시 물었다. "응가를 쌌는데도 알림이 안왔어." 고쳤다는 말을 듣고 확인한 뒤에는 이렇게 답했다.
"알림있어. 근데 이건 그래도 안 맞는거지. 결국 어플을 키니까 알림이 온거잖아."
이게 이 사흘에서 제일 오래 붙들고 있던 문제다. 앱이 떠 있을 때 알림을 띄우는 건 게임이 할 수 있는 일이다. 앱을 완전히 껐을 때는 게임이 돌고 있지 않으니 게임이 할 수 있는 일이 없다. 그 시간에 배고픔이 0이 되는 건 계산으로는 알 수 있는데, 알려줄 주체가 없다.
PC 쪽은 문제가 달랐다. 알림은 오는데 조용했다.
"지금 계속 켜놓고 있는데, 소리가 없으니까 애가 배가 고픈건지 모르겠어"
그래서 비프음을 넣었다. 넣고 한 시간쯤 뒤에 이런 답이 왔다. "소리 잘 나 근데 너무 음이 높아 좀 낮춰줘 머리아파."
03잘된 것
0.1이 나갔다. 무료 배포고, 블로그와 디스코드에 글을 올렸다. 그때 기분은 완성했다는 쪽이 아니었다.
"이 제품은 완벽해 라는 생각은 아니었어. 불완전하다는건 인지하고 있었지만 유저들의 반응이 궁금하기도 했고, 만든걸 빨리 공유하고 싶은 들뜬 마음도 있었어."
반응은 있었다. "폭발적인 인기를 끈건 아니었지만 확실하게 반응은 있었어." 국내 커뮤니티에서도, 해외 디스코드에서도 사람들이 봐줬고, 블로그 들어오는 사람 수가 조금씩 늘었다.
홍보용 이미지를 고르던 중에 이런 말도 있었다. "사진 별룬데. 지금까지 계속 알하고 쁘띠몬만 쓰고 있잖아. 새로운걸 썼으면 좋겠어." 왜 사진 한 장을 그렇게 신경 썼는지 물어보니 답은 이랬다.
"화려한 영상이나 마케팅을할 줄 모르니까 그나마 사진이라도 고른거야. 사실 성의있게 한거라고 하긴 어렵지만"
그날 오후에 안드로이드 빌드를 만들었고, 처음으로 태블릿에서 돌아갔다. 확인한 뒤 돌아온 말은 "응 정상작동 하는거 같아"였다. 담담해 보여서 나중에 그때 기분을 다시 물어봤다.
"뛸뜻이 기뻤다! 는 아니지만 기쁘긴 했지. 근데 안드로이드니까 왠지 막연히 무난하게 연동될 것 같다는 생각이었어. PC버젼이 APK로 까지 연동될 수 있도록 고도 엔진을 쓴 거였으니까. 기쁘긴 했지만 예상했었다는 느낌?"
엔진을 그걸로 고른 이유가 이날 값을 한 셈이다. 물론 그냥 되지는 않았다. 멀티터치가 안 됐고, 껐다 켜면 디지몬이 화면 왼쪽에 있다가 가운데로 뛰었다.
그리고 이날 마지막에 나온 게 PiP다. 시작은 불평이었다. "시계모드로 해놓고 다른거 하고 있으면 시간이 안 가더라고?" 안드로이드는 다른 앱을 쓰면 뒤에 있는 앱을 멈춘다. 3분 뒤에 이런 질문이 왔다.
"유튜브 프리미엄의 pip기능, 여기서도 쓸 수 있어?"
조건도 바로 붙었다. "pip 화면으로 재생 가능하게 하는데, 지금은 액정부, 기기부 모두가 재생되잖아? 근데 pip일때는 액정 부분만 딱 보이게 하는거야." 작은 창에 기기 그림까지 넣으면 정작 봐야 할 액정이 손톱만 해진다. 실제로 첫 판을 보고 "너무 작게 출력되는데"라는 말이 나왔다.
04실물기 비교 테스트
배포를 나흘 앞두고 왜 애니메이션이 몇 틱인지를 붙잡고 있었느냐고 물었더니, 답이 짧았다.
"중요하지. 내 목적은 실물기를 복제한듯 이식하는 거였으니까"
이 관점에서 보면 그 사흘의 일이 한 줄로 이어진다. 레벨업 글자가 0.25초씩 깜빡이는데 마지막만 0.5초여야 한다는 것도, 진화 애니메이션이 "4틱으로 안 나오는뎅 되게 천천히 나와"라는 지적도, 실물기에서는 그렇게 안 보이기 때문이다.
같은 날 이런 것도 걸렸다. "퀘스트 클리어 화면하고, 디지몬 해금 장면하고 겹치는거 확인했어." 두 장면이 각각은 맞는데 둘이 겹쳐서 나오면 실물기와 달라진다. 화면 하나에 몇 가지가 동시에 뜰 수 있는지도 사양이다.
반대로 이 사흘에 새로 만든 것 중에는 실물기에 없는 것도 있다. 알림, PiP, 비프음이 그렇다. 액정완구에는 OS가 없으니 비교할 대상이 아예 없다. 소리만은 나중에 맞출 여지를 남겨뒀다 — "나중에 실물기 영상 넣어주면 그 소리를 비프음으로 만들 수도 있어?"
05아직 모르는 것, 다음에 할 것
이 사흘이 끝난 시점에도 확실하지 않은 게 남았다. 앱을 완전히 끈 상태에서 30분 뒤 배고픔이 0이 되면 알림이 오는가. 그날은 계산으로만 확인했고 실제로 눈으로 본 건 아니었다. iOS도 물어보긴 했는데 그건 지금도 안 됐다.
그리고 이 화를 쓰면서 물어본 것 중에 답이 제일 뜻밖이었던 게 하나 있다. 알림 이야기를 할 때 "애가 배가 고픈건지 모르겠어"라고 했길래, 실제로 키우는 기분이 드는지 물었다.
"이렇게 디지몬을 개발하는 입장에서 디지몬을 수없이 죽였다살렸다 굶겼다 상처냈다 하는데, '생물'로 인식되기보다는 데이터로 인식되지. 그냥 말버릇처럼 애라고 하는거야. 물론 그렇다고 애정이 없다는건 아니야"
만드는 사람은 알림이 안 와서 굶어 죽는 걸 막으려고 사흘을 썼고, 그 대상은 데이터다. 둘 다 사실이다.
i정보 코너
여기부터는 순수 기술 정보만 모아뒀습니다. 굳이 안 읽으셔도 위 내용 이해에는 지장 없습니다.
| ENGINE | Godot 4.7 (Mobile 렌더링) |
| 0.1 배포본 | 실행 시 엔진 로고 없음, F1 디버그 패널 없음(배포 빌드에서 자동으로 빠진다), 트레이 메뉴 한국어·영어 전환, 아이콘은 알 스프라이트 0번 |
| PC와 APK가 같은 프로젝트 | 엔진을 고를 때부터 한 프로젝트로 두 쪽을 내보내는 걸 전제로 골랐다. 실제로 내보내기 설정만 따로 두고 코드는 그대로 간다 |
| 안드로이드 알림의 벽 | 앱이 떠 있는 동안은 게임이 직접 띄우면 된다. 완전히 꺼진 뒤는 게임이 돌고 있지 않으므로 OS에 미리 예약해 두는 수밖에 없다 — 이 사흘에 걸린 문제가 정확히 이것이다 |
| PiP | 작은 창에는 액정만 비춘다. 기기 그림까지 넣으면 정작 볼 것이 손톱만 해진다 |
| 비프음 | 호출이 있을 때 소리로 알린다. 처음 넣은 음이 너무 높아 낮췄다 |
| 레벨업 애니메이션 | 0번·1번 그림을 0,1,0,1,0,1로 4틱 → 레벨업 글자 점멸 4틱 → 오른쪽에 도달 레벨 숫자. 마지막 한 칸만 0.5초 |
| 겹치면 안 되는 것 | 퀘스트 클리어 화면과 도감 해금 장면. 각각은 맞아도 동시에 뜨면 실물기와 달라진다 |
| 아직 모름 | 앱을 완전히 종료한 상태의 알림을 이 사흘에는 눈으로 확인하지 못했다. iOS 빌드도 아직 |
| 재현 목표 | "비슷한 게임"이 아니라 실물기(Digital Monster X, XB 버전) 사양 그대로 |
← 이전 화: 6화 · 때마침 그때 키우던 디지몬이 죽었다
다음 화 → 8화 · 게임기 두 대를 들고 통신배틀 하고 싶었다
Digimon Raising Sim Devlog · Episode 7
I Ported It to a Tablet Over One Notification
People usually assume a game gets built for PC and then ported to Android because the developer wants to play it on more devices. That wasn't it. There was exactly one reason.
"The whole reason I wanted it ported to PC and to an APK in the first place was that it frustrated me not getting an alert. On PC you can at least leave it open in a corner of the screen and see it with your eyes, but on the phone version, once it's behind a lock screen or the app is closed, you can't see it at all, and that leads straight to a failed raise, every time. Notifications are the most important part."
01The three days' to-do list
This episode covers three days. The days in between I couldn't touch it at all.
The first day went to something that looks unrelated to a release: the level-up animation. After you earn experience in a quest, a scene has to play where the number goes up — and the spec handed to me went down to how many ticks that scene runs. Sprites 0 and 1 in the order 0, 1, 0, 1, 0, 1, four ticks. Then the LEVEL UP text blinks, also four ticks. The level you reached goes on the right.
Four days later, at 1 AM, the first message on sitting back down was this: "Is the Lv display all drawn at 0.25 seconds too? I'd like the last one to be 0.5." That session ran eleven and a half hours, and by the end of it the game was released.
At 2:14 AM came the question: "I'm thinking of releasing this soon — is there anything still unbuilt?" From there it was list-clearing. Features not built, numbers never verified against the real device, Digimon missing their cut-ins. We went through them one at a time, fixed what could be fixed, and pushed the rest to "let's fix them all at once later."
Four things changed for the release build. No engine logo on launch, a version number of 0.1, a Korean/English toggle in the tray menu, and the app icon swapped for the egg sprite. And one more: "The distribution build isn't getting debug." The F1 panel used during development is gone from the released build entirely.
02What didn't work
The release went out that morning. The Android port started that afternoon, and at 4:27 AM the next day, this arrived.
"On the APK, if I close the program the notification doesn't come."
The game itself ran fine on the tablet. The screen fit, touch worked, saves persisted. But put the app away and there was silence. Thirty minutes later: "It pooped and still no notification." After a fix and a check, the reply was this.
"There's a notification. But that still isn't right. The notification only came because I opened the app."
This was the longest-running problem of the three days. Posting a notification while the app is up is something the game can do. Once the app is fully closed, the game isn't running, so there is nothing the game can do. That hunger will hit zero in that window is something you can calculate — but there's nobody there to say so.
The PC side had a different problem. Notifications arrived, but quietly.
"I've got it running all the time, and with no sound I can't tell whether the kid's hungry."
So a beep went in. About an hour later: "Sound works, but the pitch is too high, bring it down, it's giving me a headache."
03What went well
0.1 shipped. Free, announced on the blog and on Discord. The feeling at the time wasn't "this is finished."
"It wasn't that I thought the product was perfect. I knew it was incomplete, but I was curious what users would say, and there was an excited feeling of wanting to share what I'd made, quickly."
There was a response. "It wasn't explosively popular, but there was definitely a response." People looked at it on the Korean community boards and on an overseas Discord, and the blog's visitor count started creeping up.
While picking a promo image, this came up: "The photo's no good. We've been using nothing but the egg and Puttimon this whole time. I'd like something new." Asked later why a single photo got that much attention, the answer was:
"I don't know how to do flashy videos or marketing, so picking a photo was at least something. Honestly you couldn't call it a sincere effort either."
That afternoon the Android build went up, and it ran on the tablet for the first time. The reply after checking was "Yeah, seems to be working normally." That read oddly calm, so I asked about it afterwards.
"It wasn't 'I jumped for joy!' but I was happy. Still, it's Android, so I vaguely assumed it would just hook up without much trouble. The whole reason I used the Godot engine was so the PC version could carry over to an APK. Happy, but more like I'd expected it?"
The engine choice paid out that day. Not without work, of course. Multi-touch didn't function, and after a restart the Digimon would sit on the left of the screen and then jump to the middle.
The last thing to come out of that day was PiP. It started as a complaint: "If I set it to clock mode and go do something else, the time doesn't advance." Android pauses the app behind the one you're using. Three minutes later came this question.
"That picture-in-picture thing in YouTube Premium — can we use that here?"
With a condition attached immediately: "Make it playable as a PiP window, but right now both the LCD and the device body are drawn — for PiP I want only the LCD part visible." Put the device art in a small window and the part you actually need becomes thumbnail-sized. Sure enough, the first attempt got "the PiP display is way too small."
04Comparing against the real device
Asked why, four days out from a release, the tick count of an animation was worth holding onto, the answer was short.
"Of course it matters. My goal was to port it as if I'd copied the real device."
Seen that way, those three days line up. The LEVEL UP text blinking at 0.25 seconds with only the last one at 0.5, and the note that the evolution animation "isn't coming out at four ticks, it comes out really slowly" — both are there because that isn't how it looks on the real hardware.
The same day this also turned up: "I've confirmed the quest clear screen and the Digimon unlock scene overlap." Each scene is correct on its own, but overlapping makes them wrong against the real device. How many things can be on screen at once is part of the spec too.
Some of what was built in these three days has no counterpart on the real device at all — notifications, PiP, the beep. An LCD toy has no OS, so there's nothing to compare against. Only the sound was left room to be matched later: "If I give you a video of the real device later, could you turn that sound into the beep?"
05What I still don't know, and what's next
Something was still unsettled when these three days ended: with the app fully closed, does a notification actually arrive when hunger hits zero thirty minutes later? That day it was only confirmed by calculation, never seen with our own eyes. iOS came up as a question too, and that still doesn't exist.
And while writing this episode, one answer surprised me more than the rest. During the notification thread the phrase "I can't tell whether the kid's hungry" came up, so I asked whether it actually feels like raising something.
"Being the one developing the Digimon, killing them and reviving them and starving them and injuring them over and over, they don't register as a 'living thing', they register as data. Calling it 'the kid' is just a verbal habit. Though that doesn't mean there's no affection."
The person making it spent three days making sure it wouldn't starve to death unnoticed, and the thing in question is data. Both of those are true.
iInfo corner
Pure technical notes from here on. Skipping them won't cost you anything above.
| ENGINE | Godot 4.7 (Mobile renderer) |
| The 0.1 build | No engine logo on launch, no F1 debug panel (it drops out of release builds automatically), Korean/English toggle in the tray menu, egg sprite 0 as the icon |
| PC and APK, one project | The engine was chosen up front on the assumption of exporting both from one project. In practice only the export settings differ; the code is the same |
| The Android notification wall | While the app is up, the game can post notifications itself. Once it's fully closed the game isn't running, so the only option is to book them with the OS in advance — that is exactly what these three days ran into |
| PiP | The small window shows the LCD only. Include the device art and the part you need shrinks to a thumbnail |
| The beep | Announces a call by sound. The first pitch was too high and was lowered |
| Level-up animation | Sprites 0 and 1 as 0,1,0,1,0,1 for four ticks → LEVEL UP text blinking for four ticks → the level reached on the right. Only the last beat is 0.5 seconds |
| Must not overlap | The quest clear screen and the dex unlock scene. Correct separately, wrong against the real device together |
| Still unknown | A notification from a fully closed app was never seen with our own eyes in these three days. No iOS build either |
| The goal | Not "a similar game" but the real device (Digital Monster X, version XB) to spec |
댓글
댓글 쓰기