# GodDem ← EerieVillage 스킬 시스템 이식 설계 SOT v1 > **작성**: Fable5(총괄PM) 2026-08-20 · **PD 지시**: EerieVillage(E:\EerieVillage)의 레벨업 스킬(3종 선택) + 연출 이펙트를 GodDem SurvivalBattle에 이식 > **위임**: 개발팀장(Opus) → C49 · 단계 분할(S1 프레임워크+대표3종 → S2 확장) ## 0. 핵심 판정 (Explore 실측 근거) EerieVillage 스킬 시스템은 **Platformer 스타터킷에 강결합**(`.asmdef` 없이 단일 어셈블리, `Platformer.Mechanics.Health`·`EnemyController`·`Core.Simulation` 직접 참조). **폴더 통째 복사 = 컴파일 불가.** → **"자산은 그대로, 로직은 GodDem 구조로 재구현"** 방식. | 구분 | 처리 | 근거 | |------|------|------| | **데이터 클래스** `SkillDataAsset`·`ActiveSkillData`·enum(`ActiveCategory`·`ActiveTrigger`·`ProjectileTrajectory`·`RangeTier`·`AttributeTags`·`TypeTags`) | **그대로 이식** | Platformer 무의존 순수 ScriptableObject. 단 base의 Platformer using이 있으면 제거 | | **스킬 데이터** `Assets/Resources/Skills/Active/*.asset` (ActiveSkillData 14개) | **그대로 이식** (Resources 경로 유지) | FX GUID 참조 보존 필요 | | **FX 프리팹** (ParticleSystem, `FX_BloodSkill`·`FX_DarkSkill`·`FX_FireSkill`·`FX_Slash_Collection` 등) | **사용분 복사** (GUID 유지) | 연출 재현. .asset이 참조하는 GUID가 깨지지 않게 | | **이펙터** `Scripts/Skills/Effectors/*` | **GodDem 재구현** | Platformer 강결합(`FindObjectsByType`·`Health.Decrement`) | | **런타임** `ActiveSkillRuntime`·`PlayerSkillInventory`·`SkillRuntimeFactory` | **경량 재구현** | Simulation 이벤트버스 의존 제거 → 직접 호출 | | **버림** `SkillPlaceholders`·`SkillCardPlaceholder`·`IngameChoiceSkillUI`(빈 stub)·Passive/Awakening stub(효과 없음) | 미이식 | 실런타임 미사용 | ## 1. GodDem 어댑터 매핑 (이펙터 재구현 계약) | EerieVillage(Platformer) | GodDem SurvivalBattle | |--------------------------|------------------------| | `FindObjectsByType()` + Layer "Enemy" | `SurvivalBattleManager.Instance.Enemies` (List, `!IsDead` 필터) | | `Health.Decrement(int)` / `DecrementBypassInvuln` | `SurvivalUnit.TakeDamage(float)` | | `PlayerController.Facing`(Vector2) | 중앙 고정 → **가장 가까운 적 방향** 계산(`Player.transform.position` 기준) | | `Health.IsAlive` | `!SurvivalUnit.IsDead` | | `Simulation.Schedule()` | 직접 호출 (이벤트버스 불필요) | | `EnemyDeath` 체인 + `ExperienceSystem` | 기존 `SurvivalBattleManager.OnEnemyDied`(골드·EXP 이미 처리) | | 2D 물리 `Physics2D.OverlapBox/Raycast` | 그대로 (GodDem도 2D) — Layer·지면 raycast만 GodDem에 맞게 | | FX 스폰(`Instantiate`+`ParticleSystem.Play`+`FxAutoDestroyUnscaled`) | 그대로 (풀 없이 Instantiate/Destroy) | ## 2. 스킬 목록 (레벨업 풀 노출 10종 — 카테고리별 이펙터) | CardId | 스킬 | Category | 이펙터(재구현) | |--------|------|----------|----------------| | A02 | 파이어볼 | Projectile(Line) | 투사체 직선 → 최근접 적 방향 | | A15 | 추적화염구 | Projectile(Homing) | 유도 투사체 | | A13 | 천둥발 | Projectile(Arc/관통) | 관통 투사체 | | A08 | 저주의화살 | Projectile(TargetEnemy) | 조준 투사체 + 디버프스택 | | A05 | 학익진 | MeleeArea | 플레이어 주변 범위 | | A12 | 정화의빛 | MeleeArea(2차판정) | 범위 + 2차 히트박스 | | A04 | 천둥 | MeleeArea(낙뢰) | 화면 내 랜덤 적 낙뢰 | | A_Laser | 용염레이저 | MeleeArea(레이저) | 방향 긴 박스 지속피해 | | A06 | 독늪 | PlacementPersistent | 지면 배치 지속 장판 | | A11 | 정령불 | Minion | 회전 방패 소환 | | A10 | 분신 | Minion | 플레이어 복제 재발동 | **Phase S1 대표 3종**: A02 파이어볼(투사체) · A05 학익진(범위) · A04 천둥(낙뢰) — 카테고리 3종 커버. **Phase S2**: 나머지 확장. ## 3. 레벨업 연결 (기존 시스템 확장) - 현재 `SurvivalSkill.cs` = 스탯 버프 3종 택1. Play_UI_ChoiceSkill UI는 Phase A 완성. - 확장: 스킬 종류를 **패시브(스탯버프, 현행)** + **액티브(발동형, 신규)** 2계층으로. 레벨업 3종 택1 풀에 액티브 스킬 혼합. - 액티브 스킬 습득 → `SurvivalActiveSkillRunner`(신규 MonoBehaviour)가 쿨타임 관리 → 발동 시 이펙터 Trigger. - 재픽 시 레벨업(StackLevel++) → 데미지/쿨타임 강화. - 데미지 = `BaseDamage × Player.Attack 연동 × StackFactor` (GodDem 스케일 조정). ## 4. 단계·위임 | Phase | 범위 | 검증 | |-------|------|------| | **S1** | 데이터클래스 이식 + FX 도입(대표3종 사용분) + 이펙터 3종(투사체/범위/낙뢰) + `SurvivalActiveSkillRunner` + 레벨업 연결 | Play — 스킬 습득 후 실제 발동·FX·적 피해·처치 | | **S2** | 나머지 이펙터 7종(유도/관통/조준/2차판정/레이저/독늪/분신) 확장 | Play 각 스킬 | | **S3** | 밸런스 튜닝(데미지/쿨타임 GodDem 스케일) | balance-designer | ## 5. 주의 - Unity MCP 단일 인스턴스 = 개발팀장 전담. - FX 481 프리팹 전량 복사 금지 — .asset 참조 GUID 추적해 **사용분만**(무거움 방지). 개발팀장이 각 .asset의 FX GUID를 실측해 선별. - `ActiveSkillData` base가 Platformer using 참조 시 제거(순수 데이터화). - EerieVillage = 우리 조직 자산(BT12-Dev 구축). 저작권 문제 없음. - 밸런스 수치는 EerieVillage 값 이식 후 GodDem 스케일(Player.Attack 22·적 HP 60~) 대비 재조정 필요(S3).