게임 · 앱 프로젝트 — Unity / React Native / Tauri
시선아이티 면접의 두 직무(AI Chatbot / SI)에서 "프로젝트 경험"의 원천이 되는 작품군. 코드를 직접 읽어 검증한 것은 코드 인용, 소스가 유실·비공개인 것은 [UNVERIFIED]로 명시했다 — 면접에서도 이 구분을 지키는 것이 안전하다.
Settlement Story / 정착지 이야기
2022 · Google Play 코드 검증Unity 단독 개발 정착지 시뮬레이션. 5상태 시민 FSM + A* 경로탐색 + 60초 일과/밤 사이클이 코어 루프. 모든 도트 픽셀 직접 제작.
- 시민 AI: `enum CitizenAction { SLEEP, WORK, FREE, NONE, MOVE }` (Citizen.cs:1339-1342) — MOVE가 모든 목적지 이동의 허브, 매 틱 OneMinute()에서 상태 평가 (Citizen.cs:660)
- A*: Tilemap 셀 → Node[,] 변환, openList F값 선택, 직선 10/대각 14, H=맨해튼×10, dontCrossCorner 코너 끼임 방지 (PathManager.cs:86-143, 260-296)
- 일과/밤: 하루 60초, count==30에서 침략자 스폰 확률 = 100+level×100 − 방어건물 보정(경비초소 워커당 150 등), 10~990 클램프 (TimeManager.cs:54-74)
- 전투: 근무 건물 타입별 시민 스탯 변화(GUARD_POST 400/50 등, Citizen.cs:31-99), 침략자 시야 3 재선정·10틱마다 사격 (Raider.cs:99-166)
Runaway If You Can
2024 · 연구 코드 검증지속적 강화학습 기반 게임 난이도 조절. DQN으로 학습한 경찰 NPC가 플레이어 경로를 예측·차단.
- 11-dim 관측(최근 5 step 방향 + 팀 ID) → [20,20] argmax 2 정수 → 도둑 좌표 ±10 clamp 배치
- 학습(Python DQN)과 추론(Unity Barracuda + ONNX) 분리 — ML-Agents는 환경 관례만
- 매 회차 하위 경로를 replay buffer에 추가 + 가중치 이어받기(w_t→w_{t+1})로 cold start 회피
BAEM: Snake Game
2022 · Google Play (소스 유실) [UNVERIFIED]스네이크 룰 변주 — 13×13 보드, 7색 몸통, 같은 색 3연속 먹으면 소멸. 하드 손상으로 소스 완전 유실. [UNVERIFIED — 포트폴리오 서술 기반]
- 루트 설계: 매칭 길이 3(노력/보상 균형), 7색(즉시 구분 가능한 최소), 13×13(모바일 세로+전략 깊이)
- 면접에서는 구현 상세가 아닌 룰 설계 결정 + '백업 부재'라는 정직한 교훈으로 서술
mnemo — Memory Card Game
2025 · App Store [UNVERIFIED]React Native 메모리 짝맞추기 iOS 게임. 12/20/30/40장 + Challenge, 20+ 테마, Game Center. [UNVERIFIED — 비공개 레포, 포트폴리오 서술 기반]
- Fisher-Yates 셔플 + 난이도별 그리드 3×4→4×5→5×6→5×8
- AsyncStorage 로컬 우선, Game Center엔 점수만 — 서버 비용 0, '데이터 수집 없음'
- 20+ 테마를 6색 슬롯(background/surface/cardBack/cardFront/accent/text) 토큰 하나로 정의
logit — Log of the Day
2025 · App Store [UNVERIFIED]미니멀 데일리 로깅 iOS 앱. 카드 한 장이 로그 하나. 감정 분석까지. [UNVERIFIED — 비공개 레포, 포트폴리오 서술 기반]
- `LogCard {id, createdAt, mood[], eventType[], comment?, image?}` 단일 타입 정규화 — 입력·타임라인·통계가 한 모델 위에
- 기분 6종에 valence/arousal 2차원 수치 → 감정 레이더 차트를 수치적으로 계산
- syncMetadata(version/isDirty/deviceId) 필드로 향후 클라우드 동기화 대비 설계
oxinot → oximemo — 마크다운 아웃라이너/메모
2025 · 오픈소스(GPLv3) → oxi 생태계 편입 코드 검증Tauri 2 마크다운 아웃라이너(oxinot)가 oxi 생태계의 카드 기반 메모 앱(oximemo)으로 진화. 두 구현 모두 코드 분석 완료.
- oxinot(공개 레포): 블록 순서를 프랙셔널 인덱싱으로 — calculate_middle(before,after) 중간값, 정밀도 한계 시 rebalance — 삽입/이동 O(1) 근처
- oximemo(로컬, 개명 2026-08-02): 3계층 스토리지 — 평문 .md(진실) + redb 메타(비트 반전 sort_key로 최신순 커서 페이징) + tantivy BM25(재생성 가능한 캐시)
- 원자적 쓰기(tmp+fsync+rename, 부모 디렉토리 fsync) + fs2 flock 크로스 프로세스 락으로 CLI·GUI vault 공유
- BLAKE3 정규화 해시(body+favorite만) → 본문 없는 매니페스트 해시 diff 동기화
배경지식 — 이 작품군을 관통하는 개념
- 유한 상태 머신 (FSM)
- NPC AI의 가장 기본 패턴 — 상태 열거 + 전이 조건. Settlement Story는 5상태로 압축하고 MOVE를 이동 허브로 재사용해 코드 중복을 제거했다. 상태가 늘면 관리가 어려워져 행동 트리(Behavior Tree)·GOAP·Utility AI로 진화하는 스펙트럼이 있다 — Runaway의 개별 경찰(wander/chase/...)도 FSM, 배치 결정만 학습 정책에 위임한 이원 구조.
- A* 경로탐색
- 그리드 최단경로의 표준 — 실제 비용 g와 휴리스틱 h(맨해튼 거리)의 합 F가 낮은 노드부터 탐색. h가 과대평가하지 않으면(admissible) 최적해 보장. 다이아고날 비용 14/직선 10은 √2≈1.4를 정수로 근사한 관례. Settlement Story는 캐시 없는 틱 기반 재계산 — 소규모 맵 전제의 트레이드오프.
- 프랙셔널 인덱싱 (fractional indexing)
- 순서가 있는 목록에서 이웃 사이 삽입을 정수 인덱스 재배치 없이 하려면 실수 '무게'의 중간값을 쓴다. 유한 정밀도로 간격이 소진되면 일괄 재밸런싱. Figma/Logseq류 협업 편집기의 순서 관리 표준 기법 — oxinot이 블록 재정렬에 사용.
- 로컬 우선 (local-first) 아키텍처
- mnemo/logit(AsyncStorage), oxinot(.md 파일), oximemo(파일+인덱스) 모두 '진실은 로컬' — 서버 없이 동작하고 동기화는 선택. 인덱스/캐시는 언제든 원본에서 재생성 가능해야 한다는 원칙이 oximemo의 3계층 스토리지로 구현돼 있다.
- 원자적 쓰기와 크로스 프로세스 락
- 크래시 중간에 반쪽 파일이 남지 않게 tmp→fsync→rename으로 쓰기(oximemo files.rs). redb는 인-프로세스 락만 보장하므로 CLI와 GUI가 같은 vault를 쓸 땐 OS 수준 flock(shared/exclusive)이 필요하다 — 데스크탑 앱 동시성의 기본기.
- valence-arousal 감정 모델
- 감정을 쾌-불쾌(valence) × 각성도(arousal) 2차원 좌표로 놓는 심리학 모델(Russell). logit이 기분 태그에 좌표를 부여해 '감정 레이더'를 그린 것은 UX에 심리학 모델을 코드로 구현한 사례.
면접 한 줄 답변
- "게임 개발 경험?" — Unity로 정착지 시뮬레이션(Google Play 출시, 시민 FSM+A*+일과 사이클)과 강화학습 연구(Runaway, DQN 경로 예측)를 했습니다. 하나는 전통 게임 AI, 하나는 학습 기반 AI — 스펙트럼 양 끝을 다뤘습니다.
- "AI 경험의 폭은?" — 규칙 기반(FSM)부터 강화학습(DQN), 통계 학습(선형/Ridge 회귀 헌혈 예측)까지. 문제 성격에 따라 도구를 골랐습니다 — 게임 NPC엔 FSM, 경로 예측엔 RL, 적은 데이터의 수요 예측엔 해석 가능한 회귀.
- "출시 경험?" — Google Play 2종(정착지, 스네이크) + App Store 2종(mnemo, logit). 스토어 심사·개인정보 처리방침·'데이터 수집 없음' 프라이버시 설계까지 혼자 다 했습니다.
- "오픈소스?" — oxinot(GPLv3, Tauri 2 마크다운 아웃라이너)를 공개했고 지금은 oxi 생태계의 oximemo로 발전시켰습니다. 프랙셔널 인덱싱, 원자적 쓰기, 파일락 같은 데스크탑 엔지니어링을 다룹니다.
- "소스 유실 프로젝트는?" — BAEM은 하드 손상으로 소스가 완전히 유실됐습니다. 그 뒤로 모든 프로젝트를 git+원격으로 관리합니다 — 정직하게 인정하고 교훈으로 연결합니다.