Game · Unity 2021.3 · C# · Pixel Art

Settlement Story / 정착지 이야기

2022년 여름 Google Play에 출시한 정착지 시뮬레이션 모바일 게임. Unity로 단독 개발했고, 게임 내 모든 도트 픽셀 아트와 UI를 손으로 작업했다. 글로벌 대상으로 약 100회 다운로드되었고, 동일한 아트 에셋은 Unity Asset Store에서도 판매 중이다.

역할
기획 · 프로그래밍 · 아트 · 퍼블리싱 전부 단독
엔진
Unity 2021.3.4f1 · 2D Tilemap · TextMeshPro
언어
C# (MonoBehaviour / Coroutine / ScriptableObject)
출시
Google Play · 2022년 8월 · 글로벌 + 한국어(정착지 이야기)
아트
Aseprite로 직접 도트 픽셀 작업 — 캐릭터·건물·타일·UI 전부

1. 게임 화면

시작은 텐트 하나와 농부 한 명. 자원(물·식량·돈·재료)을 모아 집·우물·병원·농장·교회 같은 건물을 짓고, 시민은 낮에는 일하고 밤에는 잠을 잔다는 단순한 일상이 이어진다. 자원이 고갈되거나 침략자에게 마을이 무너지면 게임이 끝난다.

Settlement Story 초기 화면 — 텐트, 농부, 작물 밭, 자원 카운터
초기. 텐트·농부·밭이 보이고 자원 카운터가 좌측에 배치
Settlement Story 중반 — 우물, 집, 교회, 농장이 깔린 정착지
중반. 우물·집·교회·농장이 깔린 정착지
Settlement Story 후반 — 침략자 4명과 교전 중인 정착지
후반. 침략자(적 NPC)가 스폰되어 시민과 교전

2. 컨셉과 장르

장르는 정착지 시뮬레이션(settlement simulation) — 좁은 타일맵 위에서 건물을 짓고 시민이 자율적으로 일·잠·사교를 반복하는 작은 모래상자다. 배·상인 시스템을 붙여 외부 자원과 교역도 가능하게 했다.

의도적으로 짧은 세션(하루 길이 60초)자원 압박을 기본으로 잡아 한 번에 5~10분씩 끊어 플레이하는 모바일 톤을 유지했다. 일과 밤 사이클이 코어 루프라서 시민 행동 설계가 곧 게임성의 대부분이었다.

3. 시스템 설계

3.1 시민 AI — 5상태 행동 모델

시민(Citizen.cs)은 매 프레임 행동 상태를 평가한다. 핵심 enum은 단 5개로 압축되며, MOVE가 모든 목적지 이동의 허브 역할을 한다.

public enum CitizenAction { SLEEP, WORK, FREE, NONE, MOVE }
시민 NPC 유한 상태 기계 다이어그램: NONE에서 WORK·SLEEP·FREE로 분기하고, 각 상태가 MOVE 허브를 통해 A* 경로로 왕복하는 전이 그래프
시민 NPC 유한 상태 기계. 화살표는 전이 조건 — 보라 엣지는 MOVE 허브와의 양방향 이동, 회색 엣지는 스폰 후 초기 상태 분기다. 낮/밤 전환(TimeManager.count)이 WORK·SLEEP·FREE를 재평가하고, MOVE는 목적지 도달 시 원래 상태로 복귀한다.
SLEEP
밤 시간대 + 거주지 도달 시. 체력 회복 코루틴 진입
WORK
낮 + 배정된 일터(농장·우물·병원 등). A* 경로 추적
FREE
일터가 없거나 체력 부족. 교회·광장 등 자유 공간 배회
NONE
행동 결정 보류 (초기 스폰·씬 로딩 직후)
MOVE
경로 추적 중 한 칸 이동 코루틴 — 모든 목적지 이동의 허브

3.2 경로 탐색 — A* on Tilemap

PathManager.cs가 A*를 구현한다. Tilemap의 각 셀을 Node[,]로 변환하고 Open/Closed 리스트 + 휴리스틱(맨해튼/유클리드)으로 최단 경로를 계산한다. 시민은 매 프레임 PathFinding()을 호출해 목표(잠자리·일터)까지 한 칸씩 이동한다. 대각선 허용/코너 차단(dontCrossCorner) 옵션으로 건물 모서리 끼임 방지.

3.3 일과 시간

TimeManager.cs가 하루 길이(기본 60초)와 진행률을 Slider로 표시한다. 시민 행동 분기는 이 일과 진행률(count)에 따라 결정된다 — 낮에는 WORK, 밤에는 SLEEP로 강제 전환한다.

3.4 침략자 전투

Raider.cs는 일정 주기마다 정착지 가장자리에서 스폰된다. 시야(sight = 3) 안에 들어온 시민을 targetCitizen으로 잠그고 FightCoroutine()에서 체력 120 · 데미지 20의 턴제 교전을 한다. 시민이 전사하면 GoAway()로 퇴각 코루틴을 시작한다.

3.5 저장

SaveManager.cs가 건물·시민·자원 상태를 JSON 직렬화로 디바이스에 저장한다. 앱 종료 후 재시작 시 정착지 상태가 그대로 복원되도록 했다.

4. 아트 — 도트 픽셀을 손으로

게임 내 모든 그래픽 — 캐릭터 5종(시민 색상 5색 + 침략자), 건물 10종 이상, 타일 90+종, UI 아이콘 — 을 Aseprite로 한 픽셀씩 손으로 찍었다. 픽셀 정렬·팔레트 통제를 손으로 직접 해야 안티앨리어싱 없이 또렷한 도트가 나오기 때문이다.

같은 에셋을 캐릭터 커스터마이즈용 5색 변형(SetBodyColor/SetTopColor/SetBottomColor/SetHairColor/SetEyesColor)으로 묶어 Unity Asset Store에 픽셀 아트 팩으로 판매 중이다. 게임용으로 만든 자산을 다른 개발자가 재사용할 수 있도록 컴포넌트 단위로 분리해 노출했다.

도트 건물 시트 — 텐트·집·우물·병원·농장 등 10종 건물
건물 시트 — 텐트·집·우물·병원·농장 등
도트 지형 타일 시트 — 초록 풀·갈색 흙·파란 물 타일
지형 타일 — 풀·흙·물
도트 캐릭터 베이스 시트 — 시민 베이스 8프레임
캐릭터 베이스 — 8프레임

5. 결과와 반응

2022년 8월 Google Play에 글로벌 출시했다. 큰 흥행은 아니었지만 약 100회 정도 다운로드가 발생했고, 한국어 리뷰가 3건 남아 있다.

Google Play Console 한국어 리뷰 스크린샷 — 로레셴·윤흠기·4zx의 별점과 코멘트, 개발자 2jeong1의 답변
실제 한국어 리뷰 — 별점·밸런스 피드백·잠금 해제 곡선 관련 지적. 개발자 계정으로 직접 응대

솔직한 회고. 출시 후 2년간 Google 개발자 계정에 아무것도 올리지 않아 계정이 삭제됐다. 정식 출시된 작품으로 다시 접근할 수 없는 상태이지만, 단독 출시까지의 전 과정 — 기획·개발·아트·퍼블리싱 — 을 직접 해본 경험은 이후 작업에 계속 영향을 주고 있다.

6. 레포지토리

Unity 프로젝트 단일 레포. 게임 코드는 Assets/Scripts 아래에 있다.

Unity_SettlementStory Unity 2021.3Private

게임 본체. Citizen AI · PathManager A* · TimeManager · Raider 전투 · SaveManager JSON · 90+ Tilemap 에셋.

a7garden/Unity_SettlementStory

7. 외부 링크