주제 : 캐주얼 아케이드, 레이싱 게임
개발 기간 : 2025.09.29. ~ 2026.01.26.
개발 인원 : Unity(1명)
사용 기술 : Addressables, ObjectPool, Firebase, UniTask, Newtonsoft.Json, Jenkins
Github : https://github.com/leejy1685/ColorPuzzle
ColorPuzzle
주제 선택 사유
알고리즘 학습(퍼즐 게임에 알고리즘이 많이 사용)
배우긴 했으나 부족하다고 느낀 기술 다시 학습(Adressables, ObjectPool 등)
Jenkins를 통한 CI/CD 학습
Firebase를 통해 외부 SDK 연결과 데이터 수집 기능을 학습
기술 스택
Addressables, ObjectPool, UniTask, Newtonsoft.Json, Jenkins, Firebase
기술적 의사결정
Addressables
Resources 폴더 탈피 : 에셋 증가에 따른 앱 초기 로딩 속도 저하를 막기 위해 Addressables를 도입, 에셋 인덱싱 최적화와 메모리 파편화 방지.
ObjectPool
팝업 시스템 최적화 :빈번하게 발생하는 팝업창의 생성과 파괴로 인한 성능 저하를 방지하기 위해 Object Pool 기법을 적용.
UniTask
효율적인 비동기 워크플로우 : Addressables의 에셋 로드 과정을 UniTask로 구현하여 가독성 높은 비동기 코드를 작성. Struct 기반의 UniTask를 활용해 런타임 가비지 발생을 억제하고 성능 최적화.
Newtonsoft.Json
내장 라이브러리의 한계 극복 : 유니티 내장 JsonUtility가 지원하지 않는 2차원 배열의 직렬화를 처리하기 위해 Newtonsoft.Json을 사용. 이를 통해 퍼즐 판의 레이아웃을 데이터 손실 없이 완벽하게 객체화.
Jenkins
자동화된 빌드 시스템 : 코드 변경 사항을 원격 저장소에 Push할 때마다 Jenkins 서버가 이를 감지하여 자동으로 빌드를 수행하는 환경을 구축. 이를 통해 반복적인 빌드 작업을 최소화하고 개발 생산성 상승.
Firebase
데이터 기반 밸런싱 : Firebase SDK를 연동하여 커스텀 이벤트를 수집. 이를 통해 유저가 느끼는 체감 난이도를 객체화된 수치로 분석.
배운 점
구현 이유
스테이지를 제작할 때 마다 씬을 생성하는 것은 비효율적.
기획자가 원하는 퍼즐을 매번 프로그래머가 제작하는 것도 비효율적.
스테이지는 기획자가 구현할 수 있는 기능이 필요.
구현 방법
스테이지를 개발하는 씬을 구현.
데이터를 Json 형태로 저장.
게임 시작 시, 스테이지 데이터 불러오기.
스테이지 선택 버튼과 컨테이너 구현.
코드
StageData
시도 횟수(integer 형)
타겟 컬러(열거형)
보드의 색(2차원 배열 열거형)
StageSaveLoader
직렬화 하려는 데이터 중, 2차원 배열이 있으므로 Newtonsoft.Json 사용.
테스트
테스트
개선 이유
단점들
개선 방안
개선된 코드
UniTask로 교체함으로써 가비지 컬렉션 발생을 최소화하고, 엔진 실행 루프에 최적화된 비동기 처리를 구현.
에러 발생 시 로그를 남기고 리소스를 안전하게 해제하는 예외 처리 로직이 추가되어 앱이 갑자기 멈추는 상황을 방지.
테스트
테스트
구현 이유
현업에선 CI/CD, 즉 지속적인 통합과 지속적인 베포 방식에 대해 학습할 필요.
구현 방법
Jenkins를 활용하여 빌드 환경을 구축.
Github Webhook으로 Pull Request가 발생하면 Main 브랜치 빌드 시작.(CI)
Github페이지에 Tag를 붙여 베포(CD)
코드 예시
Jenkinsfile
사용할 agnet 설정
환경(environment) 설정
Checkout 스테이지에선 저장소 초기화
Unity Build 스테이지에선 자바11 버전으로 Unity 빌드 시작
Github Release 스테이지 에선 결과물 압축과 압축된 파일을 Github Release해서 베포
Jenkinsfile에서 StartBuildProcess()를 사용.
Environment.GetCommandLineArgs()를 사용해서 빌드 이름과 타겟 플랫폼을 설정을 Jenkinsfile에서 할수 있게 하였음.
구현 이유
스테이지 난이도의 대한 고민, 객관적인 지표가 필요.
구현 방법
Firebase SDK를 사용하여 EventLog를 쏴서 데이터를 수집.
예시 코드
ClearInfo
AnalyticManager
FirebaseAnalytics의 기능을 프로젝트에 맞게 적용한 클래스.
FirebaseManager
Firebase를 실행시키는 클래스.
Singleton 처리 하여 언제든지 접근 가능.(AnalyticManager의 인스턴스도 포함)
구현 기능
퍼즐 해결 기능
스테이지 개발 기능
CI/CD 기능
데이터 수집 기능
시연 영상
VIDEO