ColorPuzzle

이준영·2026년 1월 27일

주제 : 캐주얼 아케이드, 레이싱 게임
개발 기간 : 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를 연동하여 커스텀 이벤트를 수집. 이를 통해 유저가 느끼는 체감 난이도를 객체화된 수치로 분석.

배운 점

스테이지 저장 기능 구현

  1. 구현 이유
  • 스테이지를 제작할 때 마다 씬을 생성하는 것은 비효율적.
  • 기획자가 원하는 퍼즐을 매번 프로그래머가 제작하는 것도 비효율적.
  • 스테이지는 기획자가 구현할 수 있는 기능이 필요.
  1. 구현 방법
  • 스테이지를 개발하는 씬을 구현.
  • 데이터를 Json 형태로 저장.
  • 게임 시작 시, 스테이지 데이터 불러오기.
  • 스테이지 선택 버튼과 컨테이너 구현.
  1. 코드
StageData
  • 시도 횟수(integer 형)
  • 타겟 컬러(열거형)
  • 보드의 색(2차원 배열 열거형)
StageSaveLoader
  • 직렬화 하려는 데이터 중, 2차원 배열이 있으므로 Newtonsoft.Json 사용.
  1. 테스트
테스트

비동기 코드 최적화

  1. 개선 이유
  • 기존 코드에서 단점들이 발견.
단점들
  • 유니티는 단일 스레드 기반이라 표준 Task를 쓰면 불필요한 힙 할당이 발생해 성능에 부담.

  • 비동기 로딩은 네트워크 상태나 에셋 누락 등 다양한 이유로 실패할 수 있음.

  1. 개선 방안
개선된 코드
  • UniTask로 교체함으로써 가비지 컬렉션 발생을 최소화하고, 엔진 실행 루프에 최적화된 비동기 처리를 구현.

  • 에러 발생 시 로그를 남기고 리소스를 안전하게 해제하는 예외 처리 로직이 추가되어 앱이 갑자기 멈추는 상황을 방지.

  1. 테스트
테스트

CI/CD

  1. 구현 이유
  • 현업에선 CI/CD, 즉 지속적인 통합과 지속적인 베포 방식에 대해 학습할 필요.
  1. 구현 방법
  • Jenkins를 활용하여 빌드 환경을 구축.
  • Github Webhook으로 Pull Request가 발생하면 Main 브랜치 빌드 시작.(CI)
  • Github페이지에 Tag를 붙여 베포(CD)
  1. 코드 예시
Jenkinsfile
  • 사용할 agnet 설정
  • 환경(environment) 설정
  • Checkout 스테이지에선 저장소 초기화
  • Unity Build 스테이지에선 자바11 버전으로 Unity 빌드 시작
  • Github Release 스테이지 에선 결과물 압축과 압축된 파일을 Github Release해서 베포
BuildScript
  • Jenkinsfile에서 StartBuildProcess()를 사용.
  • Environment.GetCommandLineArgs()를 사용해서 빌드 이름과 타겟 플랫폼을 설정을 Jenkinsfile에서 할수 있게 하였음.

데이터 수집 기능

  1. 구현 이유
  • 스테이지 난이도의 대한 고민, 객관적인 지표가 필요.
  1. 구현 방법
  • Firebase SDK를 사용하여 EventLog를 쏴서 데이터를 수집.
  1. 예시 코드
ClearInfo
  • 수집할 데이터가 묶여 있는 클래스.
AnalyticManager
  • FirebaseAnalytics의 기능을 프로젝트에 맞게 적용한 클래스.
FirebaseManager
  • Firebase를 실행시키는 클래스.
  • Singleton 처리 하여 언제든지 접근 가능.(AnalyticManager의 인스턴스도 포함)

구현 기능

  1. 퍼즐 해결 기능
  2. 스테이지 개발 기능
  3. CI/CD 기능
  4. 데이터 수집 기능

시연 영상

ColorPuzzle 시연 영상

profile
게임 개발자가 되기 위해서 공부하는 중입니다.

0개의 댓글