H5 게임 디자인 종합 가이드. 난이도 곡선, 보상 루프, 적 설계, 세션 설계, 코스터 마스터리 이론, 밸런스 검증, H5 디자인 패턴을 통합 제공합니다.
game-planner(기획)와 game-evaluator(평가) 에이전트가 게임 시스템을 설계하고 검증할 때 반드시 참조하는 도메인 지식을 통합한 스킬입니다.
이전의 h5-game-design.md와 balance-checker.md를 하나로 통합합니다.
| Phase | 시간대 | 목적 | 실패율 목표 | 감정 곡선 |
|---|---|---|---|---|
| 학습 (Tutorial) | 0~30초 | 조작법 습득, 첫 성공 경험 | 0% (보호) | 호기심 → 자신감 |
| 성장 (Growth) | 30~90초 | 새 요소 등장, 스킬 적용 | 20~30% | 집중 → 성취감 |
| 도전 (Challenge) | 90~180초 | 복합 패턴, 판단력 시험 | 50~60% | 긴장 → 몰입 |
| 극한 (Mastery) | 180초+ | 한계 시험, 최고 점수 경쟁 | 80~90% | 스릴 → 경외 |
| 파라미터 | Phase 1 | Phase 2 | Phase 3 | Phase 4 |
|---|---|---|---|---|
| 적 스폰 간격 (ms) | 1800~2500 | 1200~1800 | 800~1200 | 400~800 |
| 적 속도 (px/s) | 100~150 | 150~250 | 250~350 | 350~500 |
| 동시 적 수 | 2~3 | 4~6 | 6~8 | 8~12 |
| 적 유형 수 | 1종 | 2종 | 3종 | 전종 + Elite |
| 점수 배율 | x1 | x1.5 | x2 | x3 |
speed(t) = BASE_SPEED * (1 + ESCALATION_RATE * t / 60)
| 층 | 빈도 | 보상 유형 | 예시 | Juice 필수 |
|---|---|---|---|---|
| 마이크로 (0.3초) | 매 상호작용 | 즉각 피드백 | 파티클, 화면 흔들림, 사운드 | scale pop, 색 변화 |
| 메소 (5~15초) | 적 처치/회피 | 점수 + 콤보 | +10점, 콤보 x2, 스트릭 | 콤보 카운터 UI, 쉐이크 |
| 매크로 (30~120초) | Phase 전환/마일스톤 | 파워업/변신/환경 변화 | "Phase 2!", 신규 적 등장 | 전폭 배너, 슬로모 |
| 아키타입 | 행동 | 대응 전략 | 등장 시기 | 학습 곡선 |
|---|---|---|---|---|
| 직진형 (Charger) | 일직선 이동 | 좌우 회피 | Phase 1 | 즉시 이해 |
| 추적형 (Tracker) | 플레이어 추적 | 유인 후 급반전 | Phase 2 | 3~5회 사망 |
| 패턴형 (Patterned) | 사인파/지그재그 | 패턴 읽기 | Phase 2 | 5~10회 관찰 |
| 분열형 (Splitter) | 파괴 시 소형 분열 | 판단 (방치 vs 처리) | Phase 3 | 전략적 선택 |
| 보스급 (Elite) | 대형 + 특수 능력 | 약점 파악 | Phase 3+ | 여러 세션 |
| 환경형 (Hazard) | 고정 위치 위험 | 경로 계획 | Phase 2+ | 맵 학습 |
| 검증 항목 | 공식 | 안전 범위 | WARN | FAIL |
|---|---|---|---|---|
| 방어/화면 비율 | max_defense_radius / screen_width | <= 0.25 | 0.25~0.35 | > 0.35 |
| 속도 에스컬레이션 | phase3_speed / phase1_speed | >= 3.0 | 2.0~3.0 | < 2.0 |
| 최대 방어 도달 시간 | 파워업 누적 → 최대 방어력 | >= 90초 | 60~90초 | < 60초 |
| 스폰 간격 최소값 | min(spawn_interval) | >= 400ms | 300~400ms | < 300ms |
| 동시 오브젝트 상한 | max_concurrent_entities | <= 30 | 25~35 | > 35 |
max_aura = AURA_BASE_RADIUS + (MERGE_TIER_MAX - 1) * AURA_TIER_BONUS
screen_ratio = (max_aura * 2) / WIDTH
screen_ratio > 0.35 → FAIL: "최대 방어 범위가 화면의 {ratio*100}% — 무적 위험"
screen_ratio > 0.25 → WARN: "방어 범위 넓음, 게임플레이 테스트 권장"
screen_ratio <= 0.25 → PASS
aura/방어 반경이 메카닉에 없는 장르(플랫포머, 슈터 등)는 balance_check skip. 대신 장르 적합 지표를 자체 기술.
speed_ratio = phase3_speed / phase1_speed
spawn_ratio = phase1_spawn_interval / phase3_spawn_interval
speed_ratio < 2.0 → FAIL: "속도 상승 폭 부족"
speed_ratio < 3.0 → WARN: "속도 에스컬레이션 약함"
spawn_ratio < 1.5 → WARN: "스폰 빈도 변화 미미"
GameScene.js에서 패턴 분석:
- hasInteracted = true/false boolean 패턴 → FAIL (MC-03 영구 비활성화)
- lastInteractTime 타임스탬프 패턴 → PASS
- _enforceMechanic이 lastInteractTime 기반인지 확인
max_aura가 존재하고 최대 적 속도가 있을 때:
- aura 흡입 속도 > 적 속도 → WARN: "무적 가능성"
- 어떤 전략 조합으로도 무한 생존 가능 → FAIL
| 개념 | 변수명 패턴 |
|---|---|
| Aura 기본 반경 | AURA.*RADIUS, AURA.*BASE, PURGE.*RADIUS |
| Aura tier 보너스 | AURA.*TIER, AURA.*BONUS, RADIUS.*PER.*TIER |
| 최대 tier | MAX.*TIER, TIER.*MAX, MERGE.*MAX |
| Phase 1 속도 | PHASE.*1.*SPEED, P1.*SPEED, INITIAL.*SPEED |
| Phase 3 속도 | PHASE.*3.*SPEED, P3.*SPEED, MAX.*SPEED |
| 스폰 간격 | SPAWN.*INTERVAL, SPAWN.*DELAY |
| 화면 폭 | WIDTH, GAME.*WIDTH, CANVAS.*WIDTH |
변수를 찾지 못하면 해당 체크를 SKIP으로 표시하고 "변수 미발견" 메시지 남김.
{
"timestamp": "ISO8601",
"slug": "game-slug",
"checks": {
"aura_ratio": { "value": 0.22, "status": "PASS", "message": "방어 비율 22% — 안전" },
"speed_escalation": { "value": 3.5, "status": "PASS", "message": "속도 에스컬레이션 x3.5" },
"enforce_mechanic": { "status": "PASS", "pattern": "lastInteractTime" },
"invincibility": { "status": "PASS", "message": "무적 경로 미발견" }
},
"overall": "PASS",
"fail_count": 0,
"warn_count": 0
}
0~3초: 훅 — 화면에 즉시 움직이는 요소, 플레이어 캐릭터 구별 가능
3~5초: 목표 인지 — 피해야 할 것/해야 할 것이 자명
5~8초: 첫 입력 — 힌트 표시 (3초 무입력 시 화살표/터치 아이콘)
8~15초: 첫 성공 — 보장된 작은 보상 (적 회피/아이템 획득)
15~25초: 첫 위기 — 긴장감, 첫 적은 5초 이내 등장, 첫 위기는 15초 이내
25~30초: Phase 전환 느낌 — "이제부터 진짜"
어려움
| 불안
| +-----+
| |FLOW | <- 여기를 유지
| |ZONE |
| +-----+
| 지루함
+------------ 스킬
[H]cameras.main.shake)MAX_FLOWERS <= 30 등 상한 설정세션 중앙값 = 목표 난이도에 따른 기대 생존 시간
쉬움: 120~180초 (캐주얼 대상)
보통: 60~120초 (일반 대상) <- H5 기본값
어려움: 30~60초 (하드코어)
[H] 마크SPAWN_INTERVAL: 2000ms [H], COMBO_WINDOW: 1.5s [H](근거: Tower Defense 사례 — SupportTower 버프가 매 틱 곱셈 누적, fireRate 영구 인플레이션)
모든 수치 시스템(데미지, 속도, 스폰 간격, 방어력)은 반드시:
| 구성 | 역할 | 규칙 |
|---|---|---|
base | config.js의 불변 값 | 런타임 수정 절대 금지 |
modifiers | 활성 효과 배열 | 매 프레임/틱 재계산 |
effective | 최종 적용 값 | base * mult_total + add_total |
// ✅ 올바른 패턴
class Entity {
constructor(baseSpeed) {
this.baseSpeed = baseSpeed; // config.js에서 가져온 불변값
this.speedModifiers = []; // { type: 'mult'|'add', value, duration, startTime }
}
getSpeed() {
const mult = this.speedModifiers
.filter(m => m.type === 'mult' && !this.isExpired(m))
.reduce((acc, m) => acc * m.value, 1.0);
const add = this.speedModifiers
.filter(m => m.type === 'add' && !this.isExpired(m))
.reduce((acc, m) => acc + m.value, 0);
return Math.min(this.baseSpeed * mult + add, MAX_SPEED); // 상한 캡
}
}
// ❌ 금지: 직접 변이 (누적 인플레이션 유발)
entity.speed *= buff;
entity.damage += bonus;
tower.fireRate *= 0.9; // 매 틱 호출되면 0에 수렴
// ❌ 금지: boolean 기반 영구 버프
if (!entity.hasBuff) { entity.speed *= 2; entity.hasBuff = true; }
| 유형 | 상한 | 이유 |
|---|---|---|
| 곱셈 버프 총합 | 최대 3.0x | 3배 초과 시 밸런스 붕괴 |
| 덧셈 버프 총합 | base의 2.0x | 원래 값의 3배 초과 방지 |
| 버프 지속 시간 | 반드시 명시 (무기한 금지) | 만료 없는 버프 = 누적 |
| 버프 스택 수 | 최대 5개 동시 | GC/계산 비용 제한 |
config.js에 버프/업그레이드 시스템이 있을 때:
const로 정의되어 있는가getSpeed() 등)로 계산되는가entity.speed *= 같은 직접 변이 패턴이 없는가