블로그 목록으로
설계 노트

행성이 자라는 RPG vs 꽃이 피는 정원 — 두 앱의 진행 시스템 비교

brainfitbloomcardgame-designux

나는 두 개의 앱을 만들고 있다. BrainFit은 우주를 배경으로 한 두뇌 훈련 RPG이고, BloomCard는 정원 테마의 플래시카드 앱이다. 두 앱은 같은 근본적인 질문에 답해야 한다: 눈에 보이지 않는 성장을 어떻게 실감나게 만들 것인가? 두뇌 훈련은 인지 능력을 향상시키지만, 시냅스가 강화되는 걸 눈으로 볼 수는 없다. 간격 반복은 장기 기억을 구축하지만, 기억은 손에 잡히지 않는다. 두 경우 모두 핵심 활동은 진짜로 가치 있고 — 진짜로 보이지 않는다. 진행 시스템이 존재하는 이유가 바로 이것이다.

지난 1년간 이 두 앱을 위해 완전히 다른 두 진행 시스템을 설계하고 구현했다. 이 과정에서 게이미피케이션 디자인에 대해 어떤 책이나 GDC 강연보다 더 많은 것을 배웠다. 이 글은 두 시스템을 나란히 비교한다: 무엇이 같고, 어디서 갈라지며, 가장 중요하게는 — 왜 선택한 메타포가 이후의 모든 설계 결정을 좌우하는지.

왜 진행 메타포가 중요한가

구체적인 내용에 들어가기 전에, 좀 강하게 들릴 수 있는 주장을 하나 하겠다: 진행 시스템에서 메타포는 메커니즘보다 중요하다. 메커니즘은 튜닝할 수 있다. 임계값은 조정할 수 있다. 하지만 메타포는 플레이어에게 무엇이 자연스럽게 느껴지는지, 어떤 종류의 후퇴가 수용 가능한지, 경험의 감정적 곡선이 어떤 모양인지를 결정한다.

스트릭을 추적하는 두 가상의 앱을 생각해보자. 하나는 "탑 쌓기" 메타포를 쓴다 — 매일 벽돌 하나를 추가한다. 다른 하나는 "불 지피기" 메타포를 쓴다 — 매일 연료를 추가한다. 메커니즘은 동일하다. 하지만 탑 메타포는 영속성을 암시한다: 하루를 빠지면 벽돌이 사라지나? 그건 부자연스럽다. 불 메타포는 소멸을 암시한다: 하루를 빠지면 불이 약해진다. 그건 자연스럽다. 메타포가 한 종류의 후퇴는 불공정하게, 다른 종류는 당연하게 느끼게 만든다.

이것이 BrainFit과 BloomCard 사이에서 정확히 벌어진 일이다. BrainFit은 우주 진화 메타포를 쓰고, BloomCard는 정원 성장 메타포를 쓴다. 둘 다 핵심 활동과 연결된 진행 시스템이다. 하지만 메타포가 되돌림 가능성, 페이싱, 실패 상태에 대해 완전히 다른 설계 결정으로 이끌었다.

BrainFit: 우주를 가로지르는 진화

BrainFit의 진행 시스템은 행성 진화라고 부른다. 개인 행성이 스타더스트 구름에서 시작해, BQ(Brain Quotient) 점수가 올라가면 5단계를 거쳐 진화한다:

| 단계 | 이름 | BQ 임계값 | 시각적 설명 | |------|------|----------|------------| | 1 | 스타더스트 | 0 | 소용돌이치는 입자, 고체 형태 없음 | | 2 | 소행성 | ~20 | 바위 질감의 불규칙한 형태, 크레이터 | | 3 | 행성 | ~40 | 대기와 표면 패턴을 가진 구형 천체 | | 4 | 항성계 | ~65 | 위성이 공전하는 중심 천체 | | 5 | 은하 | ~85 | 나선 팔, 성단, 우주적 빛 |

각 단계는 7개 이상의 CustomPainter 클래스로 렌더링된다. 위성, 대기층, 표면 패턴, 글로우 효과 등을 각각 처리한다. 단계 간 시각적 차이는 극적이다 — 스타더스트 구름은 은하와 전혀 다르게 생겼다. 의도적이었다. 각 진화가 팔레트 교체가 아니라 진정한 변신처럼 느껴지길 원했다.

진화를 이끄는 것: BQ

핵심 설계 결정은 진화를 단순 플레이 시간이나 게임 점수가 아닌 BQ(Brain Quotient)에 연결한 것이다. BQ는 6개 인지 영역 — 기억력(WIS), 집중력(AGI), 논리력(INT), 언어력(CHA), 처리속도(SPD), 공간인지(SPA) — 의 성과를 종합한 0~100 점수다. 전체 BQ는 활성 영역들의 평균이다.

BQ는 비대칭 알파값을 가진 지수이동평균(EMA) 스무딩으로 계산된다:

alpha = 0.4  (BQ 상승 시)
alpha = 0.15 (BQ 하락 시)

이 비대칭은 의도적이다. 실력이 향상될 때 BQ는 비교적 빠르게 올라간다 — 진짜 성장의 보상을 빠르게 느끼게 하고 싶었다. 하지만 안 좋은 세션 후에는 천천히 내려간다 — 하루 컨디션이 안 좋다고 몇 주간의 훈련이 날아가면 안 된다. BQ에 입력되는 Elo 시스템에 대해서는 이전 글에서 다뤘지만, 요약하면: 각 인지 영역에 독립 Elo 레이팅(600~1800)이 있고, BQ는 이 레이팅들에서 0~100 스케일로 도출된다.

비가역성: 핵심 설계 선택

BrainFit 진행 시스템에서 가장 중요한 설계 결정은 이것이다: 진화는 되돌릴 수 없다. 행성이 새로운 단계에 도달하면 영원히 그 상태를 유지한다. 나중에 BQ가 떨어져도 행성은 퇴화하지 않는다.

이것은 데이터베이스의 PlanetConfigs에서 달성한 최대 진화 단계를 추적하는 방식으로 구현된다. 현재 BQ는 변동할 수 있지만, 시각적 표현은 앞으로만 움직인다.

왜 비가역적으로 만들었나? 우주 메타포 때문이다. 실제 우주에서 별은 다시 먼지 구름으로 돌아가지 않는다. 은하가 소행성으로 붕괴하지 않는다. 자연에서의 진화는 일방향 프로세스다. 행성 진화를 가역적으로 만들면 메타포를 위반할 뿐 아니라, 더 중요하게는 — 일일 성과 변동이 크고 완전히 정상적인 두뇌 훈련에서 벌을 주는 경험을 만들었을 것이다.

두뇌 훈련은 본질적으로 노이즈가 크다. 인지 능력은 수면, 스트레스, 시간대, 기타 수십 가지 요인에 따라 변동한다. 잠을 못 잔 하루 때문에 은하가 행성으로 퇴화한다면, 진행 시스템은 인지 성장이 아니라 생활 환경을 측정하는 게 된다. 비가역성은 행성이 현재 상태가 아닌 최고 역량을 대표하게 해준다.

장식: 퇴보 없는 자기 표현

진화 단계 너머의 지속적인 참여를 위해 8개 커스터마이징 슬롯이 있는 장식 시스템을 추가했다:

  1. 성운 — 배경 우주 환경
  2. 이펙트 — 행성 주변 파티클 효과
  3. 동행 천체 — 작은 궤도 물체
  4. 궤도 — 궤도 고리 스타일
  5. — 행성 고리 변형
  6. 표면 — 표면 텍스처 패턴
  7. 오라 — 발광 및 에너지 효과
  8. 크라운 — 상단 장식 요소

장식은 게임 내 화폐(스타더스트, 유성 파편)를 사용하는 가차 상점에서 획득한다. 진행 시스템 자체에 영향을 주지 않는 순수 코스메틱이다. 멋진 장식이 달린 스타더스트 행성은 맨몸의 스타더스트 행성과 다르게 보이지만, 여전히 스타더스트다. 장식은 진행 위에 표현력을 입히되, 단계가 의미하는 바를 흐리지 않는다.

BloomCard: 지식의 정원 가꾸기

BloomCard의 진행 시스템은 계정 수준이 아닌 개별 카드 수준에서 작동한다. 컬렉션의 모든 플래시카드가 정원의 식물이며, 각 카드가 독립적으로 4단계를 거쳐 성장한다:

| 단계 | 이름 | FSRS 안정성 | 시각적 표현 | |------|------|------------|------------| | 1 | 씨앗 | < 5일 | 작은 씨앗 아이콘 | | 2 | 새싹 | < 20일 | 녹색 새순 | | 3 | 꽃봉오리 | < 60일 | 봉오리가 달린 줄기 | | 4 | 만개 | >= 60일 | 활짝 핀 꽃 |

구현은 미니멀하고 우아하다. garden_utils.dart에서:

static GrowthStage getGrowthStage(double stability) {
  if (stability < 5) return GrowthStage.seed;
  if (stability < 20) return GrowthStage.sprout;
  if (stability < 60) return GrowthStage.bud;
  return GrowthStage.bloom;
}

코드 4줄. 복잡한 상태 머신도 없고, EMA 스무딩도 없다. 성장 단계는 하나의 숫자 — FSRS 안정성 — 의 순수 함수다.

성장을 이끄는 것: FSRS 안정성

FSRS 안정성(stability)은 90% 기억 확률로 기억이 유지되는 일수를 나타낸다. 전체 FSRS 구현은 이전 글에서 다뤘지만, 여기서 중요한 점은 안정성이 무언가를 얼마나 잘 아는지의 직접적인 측정값이라는 것이다. 안정성 5인 카드는 5일 정도 기억할 수 있다는 뜻이고, 안정성 60인 카드는 두 달간 기억할 수 있다는 뜻이다.

이것이 성장 단계에 의미론적 의미를 부여한다:

  • 씨앗 (안정성 < 5): 방금 배운 카드. 취약하다. 다음 주면 잊을 수 있다.
  • 새싹 (안정성 < 20): 몇 번 복습했다. 뿌리를 내리는 중. 2주 정도는 기억할 것이다.
  • 꽃봉오리 (안정성 < 60): 단단한 지식이 되어가고 있다. 한 달 이상 복습 없이도 버틸 수 있다.
  • 만개 (안정성 >= 60): 확실히 안다. 장기 기억에 단단히 심어졌다.

성장을 복습 횟수나 XP가 아닌 안정성에 연결한 것의 아름다움은 학습 품질을 정직하게 표현한다는 것이다. 복습을 남발해서 강제로 꽃을 피울 수 없다. FSRS 알고리즘이 정확히 이것을 방지한다 — 최적 간격 전에 카드를 복습해도 안정성은 크게 올라가지 않는다. 성장은 의미 있는 간격 후에 성공적으로 카드를 떠올렸을 때 일어나며, 이것이 정확히 진짜 학습이 일어나는 순간이다.

가역성: 정원 메타포의 킬러 피처

BloomCard의 시스템이 BrainFit과 근본적으로 갈라지는 지점이 여기다: 성장은 되돌릴 수 있다. 카드는 시들 수 있다. 만개한 꽃이 꽃봉오리로 돌아갈 수 있다. 새싹이 다시 씨앗으로 쪼그라들 수 있다.

이것은 FSRS 망각 곡선을 통해 자연스럽게 일어난다. 카드 복습을 멈추면 기억 가능성(retrievability)이 시간에 따라 감소한다. 마침내 다시 복습했는데 실패하면("Again" 평가), 알고리즘이 안정성을 줄인다. 안정성이 단계 임계값 아래로 떨어지면, 카드가 퇴보한다.

그리고 여기가 핵심이다: 이것이 완전히 자연스럽게 느껴진다. 왜냐하면 정원은 시들기 때문이다. 식물에 물 주기를 멈추면 만개한 상태가 영원히 유지되지 않는다. 정원 메타포가 퇴보를 벌이 아닌 예상되고 이해 가능한 결과로 느끼게 만든다.

이것은 BrainFit과 근본적으로 다른 감정적 역학을 만든다. BrainFit에서 행성은 트로피다 — 당신이 성취한 것을 대표한다. BloomCard에서 정원은 살아있는 생태계다 — 당신이 현재 유지하고 있는 것을 대표한다. 둘 다 유효한 프레이밍이지만, 유저와 앱 사이에 매우 다른 관계를 만든다.

200장의 카드가 만개한 정원은 단순한 업적이 아니다 — 능동적인 헌신이다. "나는 이 모든 것을 지금 알고 있다"고 말한다. 몇 장의 카드가 꽃봉오리로 시들면, 그것은 부드러운 신호다: "이것들에 관심이 필요해." 벌이 아니다. 실패도 아니다. 그냥 넛지다.

대시보드로서의 정원

BloomCard의 정원 화면은 전체 컬렉션의 건강 상태를 한눈에 보여주는 대시보드 역할을 한다. 그리드 뷰가 모든 카드를 성장 단계 아이콘으로 보여주고, 생성 날짜순으로 정렬된다. 덱별로 필터링할 수 있고, 씨앗, 새싹, 꽃봉오리, 만개의 분포를 즉시 확인할 수 있다.

카드 성장 위에 정원 자체도 풍부한 커스터마이징을 제공한다:

  • 6개 정원 씬 — 창틀, 책장, 발코니, 온실, 옥상, 마법숲, 달빛연못
  • 11개 날씨 효과 — 비, 눈, 무지개, 반딧불이, 벚꽃, 오로라, 유성우 등 + 실제 날씨 연동
  • 15개 장식 6개 존에 배치 — 양초, 고양이, 허브 화분, 액자, 물뿌리개, 오르골, 계절 아이템 등

모든 것이 CustomPainter로 렌더링된다 — 이모지는 어디에도 없다. 모든 아이콘이 코드로 직접 그려지며 앱 전체에 90개 이상의 painter 클래스가 있다. 이 렌더링 방식에 대해서는 커스텀 페인터 글에서 다뤘다.

핵심 설계 차이: 비가역 vs 가역

두 시스템의 근본적인 차이를 정리하겠다. 이것이 진행 시스템 설계 전반에 대해 중요한 것을 드러낸다고 생각하기 때문이다.

BrainFit의 행성 진화는 최고 수위 표시다. 당신이 도달한 최고점을 알려준다. 트로피 진열장이다. 지속적인 노력을 보상하고 안 좋은 날로부터 보호한다.

BloomCard의 정원 성장은 현재 상태 지표다. 당신이 지금 아는 것을 알려준다. 대시보드다. 지속적인 관리를 보상하고 방치를 정직하게 반영한다.

어느 쪽이 객관적으로 더 좋은 것은 아니다. 올바른 선택은 전적으로 핵심 활동의 성격에 달려있다:

  • 두뇌 훈련 성과는 날마다 변동한다. 인지 능력 자체는 시간에 걸쳐 비교적 안정적이지만, 특정 날의 측정 성과에는 노이즈가 크다. 순간순간의 상태를 추적하는 진행 시스템은 혼란스럽고 좌절감을 줄 것이다. 최고 수위 방식이 노이즈를 완화한다.

  • 기억 유지는 관리 없이 감퇴한다. 프랑스어 단어 500개를 배우고 복습을 멈추면, 진짜로 프랑스어 단어 500개를 아는 게 아니다. 여전히 안다고 가장하는 진행 시스템은 거짓말이다. 현재 상태 방식이 정직하다.

메타포가 각 접근 방식을 자연스럽게 만든다. 행성은 역진화하지 않으므로, 비가역적 진행이 장대하고 우주적으로 느껴진다. 정원은 돌보지 않으면 시들므로, 가역적 진행이 자연스럽고 동기 부여가 된다.

리스크: 쉬운 게임 반복 플레이

플레이어 성과와 연결된 모든 진행 시스템은 근본적인 리스크에 직면한다: 플레이어가 근본적인 목표가 아닌 지표에 최적화한다. BrainFit에서 이것은 가장 잘하는 인지 영역의 쉬운 게임만 반복해서 BQ 포인트를 파밍하는 것을 의미한다.

BrainFit은 Elo 수준에서 이를 해결한다. BQ가 Elo 레이팅에서 도출되고, Elo는 기대 점수 계산을 사용하기 때문에, 쉬운 문제를 반복해도 수확이 체감한다. Elo가 1400인데 800짜리 문제를 계속 풀면, 기대 점수는 0.91이므로 정답 하나가 레이팅을 거의 움직이지 않는다. 시스템이 자연스럽게 적절히 도전적인 콘텐츠를 향해 밀어낸다. 이 메커니즘은 Elo 난이도 글에서 상세히 다뤘다.

추가로, BQ는 비대칭 EMA 스무딩을 사용한다. 느린 하락 알파 0.15는 힘든 세션 후에도 BQ가 폭락하지 않게 하고, 빠른 상승 알파 0.4는 진짜 향상을 신속히 보상한다. 보호 메커니즘(3연패 시 -1/게임 상한, 일간 하한: 시작 BQ -5, 역대 하한: 최고 기록의 80%)과 결합하면, 시스템은 파밍을 매력 없게 만들면서 진정한 성장은 눈에 보이게 한다.

리스크: 과도한 복습

BloomCard는 반대 리스크에 직면한다. 성장이 안정성에 연결되어 있고, 안정성은 성공적인 복습으로 증가하니, 플레이어가 정원을 전부 만개시키려고 강박적으로 복습할 유혹이 있다.

FSRS가 이를 우아하게 해결한다. 알고리즘이 망각 곡선에 기반해 최적의 복습 간격을 계산한다. 예정일 전에 카드를 복습하면 안정성 증가가 미미하다 — 기억 가능성이 아직 높으니까. 이미 잘 기억하는 것을 "복습"하는 셈이다. 알고리즘이 본질적으로 말한다: "아직 복습 안 해도 돼. 12일 후에 다시 와."

BloomCard는 스케줄링 UI로 이를 강화한다. 학습 세션은 기한이 된 카드나 지연된 카드만 제시한다. "Extra Study" 모드로 기한이 안 된 카드를 복습할 수 있지만, FSRS 엔진은 이 복습에 안정성 크레딧을 많이 주지 않는다. 정원 성장은 자연스럽게 실제 학습 타임라인에 맞춰 페이싱된다.

이것이 중요한 이유는 과도한 복습이 학습 효율에 진짜로 해롭기 때문이다. 간격 반복의 요점은 최적의 어려움 시점에 복습하는 것이다 — 막 잊으려는 바로 그 순간에. 너무 일찍 복습하면 시간이 낭비되고, 적절한 순간을 기다리는 것보다 기억 정착 효과가 약하다.

리스크: 코스메틱만을 위한 참여

두 앱 모두가 직면하는 더 미묘한 리스크가 있다: 핵심 활동 없이 코스메틱 레이어(장식, 정원 씬, 날씨 효과)에만 참여하는 것. BrainFit을 행성 장식 배치만 하려고 열거나, BloomCard를 정원 씬을 벚꽃으로 바꾸려고만 연다면, 앱은 목적을 달성하지 못한 것이다.

두 앱 모두 핵심 활동에서 나오는 획득 화폐에 코스메틱 레이어를 연결하는 것으로 대응한다. BrainFit에서 스타더스트와 유성 파편은 게임 플레이와 미션 완료로 획득한다. BloomCard에서 물방울은 카드 학습과 스트릭 유지로 획득한다. 플레이하지 않고는 커스터마이징할 수 없지만, 커스터마이징이 플레이를 대체하지는 않는다.

장식은 보상이지, 목표가 아니다. 이 구분이 중요하다.

원칙: 게이미피케이션은 핵심을 위해 봉사한다

두 시스템을 모두 만든 후, 나는 넓게 적용된다고 생각하는 설계 원칙에 도달했다:

최고의 진행 시스템은 진행을 최적화하는 것이 핵심 활동을 최적화하는 것과 동일한 시스템이다.

BrainFit에서 행성을 가장 빨리 진화시키는 방법은 6개 인지 영역 전체에서 도전적인 게임을 플레이하고 잘 수행하는 것이다 — 정확히 두뇌 훈련 앱이 장려해야 할 행동이다. 시스템을 게이밍하는 것(쉬운 게임만 플레이, 한 영역에만 집중)은 Elo-BQ 파이프라인에 의해 적극적으로 억제된다.

BloomCard에서 정원을 가장 빨리 성장시키는 방법은 일정에 맞춰 카드를 복습하고 성공적으로 떠올리는 것이다 — 정확히 간격 반복 앱이 장려해야 할 행동이다. 시스템을 게이밍하는 것(과도한 복습, 쉬운 카드만 선택)은 FSRS 알고리즘에 의해 적극적으로 억제된다.

진행 인센티브가 핵심 활동과 완벽히 정렬되면, 게이미피케이션은 위에 붙인 조작적 레이어가 아니다. 진정한 성장의 시각화다. 행성은 정말로 인지적 성장을 대표한다. 정원은 정말로 지식 상태를 대표한다. 숫자는 진짜다. 그림은 정직하다.

이것이 내가 두 시스템 모두에 적용하는 기준이다. 플레이어가 핵심 스킬을 실제로 향상시키지 않고도 진행을 진전시킬 수 있다면, 그 시스템에는 고쳐야 할 설계 결함이 있는 것이다.

다르게 했을 것들

두 진행 시스템을 병행으로 만든 것은 실시간으로 결정을 비교할 수 있는 드문 기회를 줬다. 바꾸고 싶은 것 몇 가지:

BrainFit은 더 많은 중간 피드백이 있었어야 했다. 한 진화 단계에서 다음 단계로의 도약은 몇 주간의 꾸준한 플레이가 필요할 수 있다. 그동안 행성은 똑같아 보인다. 장식과 데일리 미션으로 부분적으로 대응했지만, 단계 내 시각적 미세 변화 — BQ가 다음 임계값에 접근함에 따라 약간 더 밝은 대기, 더 활발한 파티클 효과 — 를 추가하면 단계 사이의 경험이 더 살아있게 느껴질 것이다.

BloomCard의 시들기는 더 부드러울 수 있었다. 현재 시스템에서 만개(안정성 60)에서 꽃봉오리(안정성 59.9)로 떨어진 카드는 즉시 만개 비주얼을 잃는다. 유예 기간도 없고, 퇴보 전에 경고하는 "시들기" 애니메이션도 없다. 향후 버전에서는 실제로 단계가 떨어지기 전에 "이 카드는 곧 복습이 필요해"라고 신호하는 "시들기" 서브 상태를 추가할 수 있을 것이다.

두 앱 모두 더 많은 크로스 폴리네이션이 가능했다. BrainFit의 비가역적 최고 수위 아이디어는 BloomCard의 컬렉션 기능에 적용할 수 있다 — 특정 꽃 품종을 한 번이라도 만개시키면 카드가 시들어도 컬렉션에 영구히 남는 것이다. BloomCard의 현재 상태 정직함은 BrainFit 행성의 "최근 성과" 지표에 반영할 수 있다 — 진화 단계와 함께 현재 BQ를 보여줘서 플레이어가 최고점과 현재를 모두 볼 수 있게 하는 것이다.

마무리

진행 시스템은 장식이 아니다. 소통이다. 앱이 무엇을 중시하는지, 성장이 어떤 모습인지, 행동하지 않으면 어떤 결과가 오는지를 플레이어에게 알려준다. 선택하는 메타포 — 우주 진화든 정원 성장이든 — 는 단순한 미적 결정이 아니다. 앱과 유저 사이의 감정적 계약에 대한 약속이다.

BrainFit은 약속한다: "당신의 성장은 영구적이다. 안 좋은 날이 당신이 쌓은 것을 빼앗을 수 없다." BloomCard는 약속한다: "당신의 정원은 살아있다. 지금 진짜로 아는 것을 반영한다."

두 약속 모두 정직하다. 둘 다 유저와 핵심 활동 사이에 건강한 관계를 만든다. 그리고 둘 다 진행 메커니즘 자체가 아니라, 비주얼 뒤의 숫자가 의미 있게 해주는 기반 스코어링 시스템 — EloFSRS — 에 의해 가능해진다.

계속 돌아오는 교훈: 잘 된 게이미피케이션은 재미있게 만드는 것이 아니다. 보이지 않는 성장을 보이게 만드는 것이다 — 그리고 그것이 그리는 그림이 진실인지 확인하는 것이다.

행성이 자라는 RPG vs 꽃이 피는 정원 — 두 앱의 진행 시스템 비교