AI 게임 공장: 방치형으로 장르를 좁혀봤다
표시 날짜는 이 글이 다루는 작업의 대표 기록일이며, 당시 발행된 글을 뜻하지 않습니다. 이후 회고와 적용 방법은 2026년 9월에 정리했습니다.
여러 장르 대신 공통 엔진 하나로 좁히려는 사람에게, 엔진 계산이 맞아도 앱의 저장·화면 연결에서 왜 따로 깨질 수 있는지 장승 사례로 보여준다.
장승 출고 뒤 엔진은 오프라인 보상을 맞게 계산했지만 앱의 저장·모달 처리에서 보상이 사라졌다. 저장을 막으면 진행도가 날아가고 저장을 유지하면 보상이 새는 식으로 한 번에 안 고쳐져, 결국 ‘저장은 유지하고 정산 기준점만 보존’하는 방식으로 정리했다.
방치형 보상을 만든다면 마지막 저장 시각과 마지막 정산 시각을 같은 값으로 취급해도 되는지부터, 종료→시간 경과→재실행→수령 경로로 직접 확인한다.
연재 목차
- AI 게임 공장: 게임 하나가 아니라 만드는 과정을 만들고 싶었다
- AI 게임 공장: 많이 만들기에서 네 작품에 집중하기로
- AI 게임 공장: 완료 보고 옆에 실제 확인한 것을 적기 시작했다
- AI 게임 공장: Godot에서 웹으로 옮겨도 남았던 문제
- AI 게임 공장: 화면을 다듬고도 게임을 멈춘 이유
- AI 게임 공장: 완성 대신 부분완성이라고 적고 닫았다
- AI 게임 공장: 방치형으로 장르를 좁혀봤다
- AI 게임 공장: Swift로 옮기며 이전 공장에서 남길 것을 골랐다
- AI 게임 공장: 게임을 고치다가 검사기도 다시 고쳤다
- AI 게임 공장: 심사 제출까지 온 뒤 돌아본 AI 게임 공장
먼저 답하면
trial-tower를 출발점으로 검토했지만 최종적으로는 설계 참고로만 남기고 자체 afk-engine을 새로 짰다. 참고한 코드를 그대로 제품 핵심에 쓴 것과는 구분해야 한다.
모든 장르를 다루기 어려우면 하나로 좁혀보면 어떨까. 방치형 라인은 웹 공정을 완전히 끝낸 뒤가 아니라 8월 중순에 병행해서 갈라졌다.
자동전투와 오프라인 보상, 성장을 공통 엔진에 두고 캐릭터와 수치, 그림과 화면을 바꾸는 시도였다. trial-tower는 설계 참고로 남기고 자체 afk-engine을 구성했다. 제작 단계도 컨셉, 스킨 데이터, 에셋, 앱, 검증·출고의 다섯 단계로 줄였다.
계산은 맞았는데 보상이 사라졌다
8월 17일 대장에는 장승과 구미호가 출고완료로 적혀 있다. 이때 결과는 웹 빌드다. 스토어 출시나 심사 승인을 뜻하지 않는다.
장승에서 중요한 문제는 출고 뒤 검증에서 나왔다. 엔진은 오프라인 보상을 계산했지만 앱의 저장과 모달 처리 과정에서 보상이 사라졌다. 저장 기준시각이 갱신되고 화면에서 다시 계산되면서 핵심 보상이 어긋났다.
처음에는 보상 정산 전 저장을 막았다. 그러자 앱을 뒤로 보낼 때 진행도가 사라지는 다른 문제가 생겼다. 다시 저장은 유지하고 정산 기준점만 보존하는 방식으로 고쳤다. 지켜야 할 기준시각 하나와 저장 전체는 같은 대상이 아니었다.
구미호에서도 화면에 이펙트가 한 번 보이는 것과 연출이 충분히 전달되는 것은 다르다는 검토가 남았다. 9월 4일 후속 이펙트 수정도 있으니 이 라인을 8월에 완전히 멈췄다고 정리할 수는 없다.
장르를 좁히니 반복할 부분은 줄었다. 하지만 엔진이 맞는다고 앱의 저장과 화면까지 맞아지지는 않았다. 다음에는 계산 함수 테스트와 함께 실제로 앱을 닫았다 여는 경로부터 확인하려 한다. 방치형에서 보상은 그 사이에 생기기 때문이다.
오프라인 보상은 정산 기준점을 보존하기
방치형에서는 마지막 저장 시각과 마지막 정산 시각을 같은 값으로 두어도 되는지부터 확인할 필요가 있다. 저장은 자주 해도 보상 정산의 기준점은 수령까지 보존해야 하는 상황이 있다. 값을 하나로 합치면 저장하는 순간 받을 시간이 사라질 수 있다.
시험 경로는 종료, 시간 경과, 재실행, 보상창 열기, 앱을 뒤로 보내기, 복귀, 수령으로 구성한다. 각 단계의 기준 시각과 지급량을 기록하면 어디서 값이 바뀌는지 알 수 있다. 보상창을 닫았다 열거나 수령을 두 번 눌렀을 때 중복 지급되는지도 확인한다.
실제 구현에서는 수령 사건을 한 번만 처리하고 저장 변경과 일관되게 묶는 설계가 필요하다. 이 글의 구분은 정산 손실을 찾는 데 도움이 되지만 부정행위 방지나 서버 시간 신뢰 문제까지 해결하는 완성 설계는 아니다.
← 이전 글: 완성 대신 부분완성이라고 적고 닫았다 · 전체 목차 · 다음 글: Swift로 옮기며 이전 공장에서 남길 것을 골랐다 →