전투 시스템 분석 v1 — Program/Client 원본 (2019.4 LTS)
작성: 정현우 (code-lead) 일자: 2026-05-05 원천: Program/Client/Assets/Scripts/ (read-only SVN 2021 스냅샷) graphify 참조: GRAPH_REPORT.md Community 6/9 (SnowFamily.EvilOfDarkness 본 도메인) + Community 45 (EodMatrixTrail 클러스터 19 노드) APPROVED: 정현우 자율 (PD 출장 복귀 시 인수)
1. 한 줄 결론
GodBlade 전투 시스템 = TimeEvent 기반 데이터 드리븐 (Skill+Action 이중 레이어) + 손맛 4중 메커니즘 (콤보 100 / 카메라 흔들림 / Matrix Trail 무기 궤적 / 잔상 복제) + EventManager 발행-구독. 코드 자체는 견고하고 Unity 6 호환성 ~85%, 단 외부 의존 (Xft / Addressable Async Callback) 2건 패치 필요.
2. 손맛 메커니즘 4중 레이어
2.1 카메라 흔들림 (Camera Shake) — 4 진입점
| 진입점 | 위치 | 트리거 |
|---|---|---|
EodSkillEventShakeCamera | Skill/EodSkillEventShakeCamera.cs | 스킬 TimeEvent 시작 시 (param1=shakeEventKey) |
EodActionEventShakeCamera | Action/EodActionEventShakeCamera.cs | 액션 TimeEvent (Skill 외 일반 액션) |
EodProjectileEventShakeCamera | Projectile/EodProjectileEventShakeCamera.cs | 투사체 자체 이벤트 |
EodEntityCombatComponent line 180~191 | 인라인 | 타격 성공 시 hitedShake (CSV Projectile.hitedShake 참조) |
모두 EodCamera.Get.ShakeCamera(data) 단일 함수로 수렴. EodGameDatascriptManager.Get.CameraShakeTable.GetData(shakeKey) 가 데이터 원천. 데이터 테이블 = CameraShake.csv (Datasheets/).
제약 조건: 길드전 / 길드 토너먼트에서는 본인 캐릭터일 때만 흔들림 적용 (PvP 격렬 흔들림 방지 의도). 본 게임은 싱글 RPG 라 이 분기 제거 가능.
판단: SkillEvent / ActionEvent / ProjectileEvent / 인라인 = 4 진입점이 단일 EodCamera.Get.ShakeCamera 로 수렴 → Unity 6 포팅 시 EodCamera 만 마이그레이션하면 4 트리거 자동 흡수.
2.2 콤보 시스템 (ComboHit)
EodEntityComboHitComponent.cs(~95줄, 작음)- m_nMaxCombo = 100 (하드코딩)
- ComboDuration = 3.0f (3초 안 안 때리면 리셋)
OnHitEventBase 발행 시hitUI.IncreaseHit(entity)- UI:
EodUIComboHit(UI/EodUIComboHit.cs) — Addressable 비동기 로드 - 데이터 의존성 0 — 수치 변경 시 코드 수정 (라이브 시즌 변경 어려움). Sp02+ 어픽스/시즌 시 SO 로 빼야 함.
2.3 Matrix Trail = 무기 궤적 트레일 (Xft.XWeaponTrail wrapper)
EodMatrixTrail.cs(Foundation/) — MonoBehaviour, 외부Xftnamespace 의존- 좌/우 손 2개 (
_MatrixTrailL,_MatrixTrailR) —EodEntityCombatComponent가 양손 동시 제어 PlayTrail(playTime)/StropTrail()단순 인터페이스 (오타: Strop = Stop)- Update 에서 _Height 진동 (sin 형 위아래 0.5m 진폭) — 무기 궤적이 단순 직선이 아니라 부드러운 곡선
- Unity 6 리스크: Xft 외부 라이브러리 — Asset Store 검색 결과 X-WeaponTrail 2014년 마지막 업데이트, Unity 6 미보증. 대체안: Unity 6 내장 TrailRenderer + Bezier 곡선 / Vertex Helper 직접 구현 (~200 LOC).
2.4 잔상 복제 시스템 (Motion Effect)
EodEntityMatrixEffectComponent.cs(잘못된 명명, "Matrix" 인데 위 Matrix Trail 과 다름)- 본질: 캐릭터 본체를 Animator 째 N개 Instantiate → 0.1초 간격 순차 활성화 → 이전 프레임 애니메이션 재생 → 잔상 효과 (디아블로/베요네타류 모션 블러)
m_effectValueCount갯수 만큼 복제. 코루틴processMakeEffect → processStartEffect → processClearEffect3단 파이프- 현재 5초 주기 자동 테스트 (line 67~77) — 디버그 코드 잔존 → 포팅 시 제거
- Unity 6 리스크 중: Animator Instantiate 후 Material 교체 코드 주석 처리 (효과용 Material 미적용). 한지우(graphics-lead) 협업 슬롯 — Stencil/Ghost Material 추가 권고.
3. 스킬 시스템 아키텍처
3.1 Skill 클래스 (Skill/EodSkill.cs, 517줄)
Skill
├─ owner: EodEntity
├─ data: GameDatascript.Skill (CSV → SO)
├─ eventList: List<TimeEvent> ← TimeEvent 패턴 핵심
├─ cooldownTime / cooldownTimeMax
├─ autoCoolTime ← 오토 모드 같은 스킬 연속 방지
├─ attackSpeedRatio ← 공속 (Ability.AttackRatio × TimeCtrlSpeed)
├─ subSkillStartCheck / subSkillUseTiming ← 서브 스킬 (메인 → 서브 콤보 3초 안)
├─ Stop() / Resume() / InitializeSKill() / Update() / BuildSkillEventLists()
└─ ApplyCooldownTime() ← SkillLevelUseData 테이블에서 baseCoolTime + 쿨감 % 적용
핵심 패턴:
- CSV
Skill.generalTypeCode→SkillEvent테이블 unitList →SkillEventBuilder.CreateSkillEvent팩토리 → 13 종류 TimeEvent 인스턴스화 Update()에서elapsedTime / fLastAttackSpeedRatio비교 → 시간 기반 이벤트 발화attackSpeedRatio = AttackRatio × TimeCtrlSpeed동시 적용 — 공속과 슬로우/배속 효과 결합
3.2 13 SkillEvent 종류 (SkillEventBuilder.cs)
| eSkillEventType | 클래스 | 용도 | 손맛 영향도 |
|---|---|---|---|
| MoveForward | EodSkillEventMoveFoward | 직선 이동 | 중 |
| MoveDirection | EodSkillEventMoveDirection | 입력 방향 이동 | 중 |
| MoveToNearestTarget | EodSkillEventMoveToNearestTarget | 최근접 타겟 돌진 | 높음 (대시 손맛) |
| MoveForwardAutoToNearTarget | EodSkillEventMoveDirectAutoToNearTarget | 소용돌이 (이동 중 컨트롤) | 중 |
| TeleportForward | EodSkillEventTeleportFoward | 순간이동 전방 | 높음 |
| TeleportBack | EodSkillEventTeleportBack | 순간이동 후방 (백스텝) | 높음 |
| Rotate | EodSkillEventRotate | 즉시 회전 (각도 지정) | 낮음 |
| RotateDirection | EodSkillEventRotateDirection | 입력 방향 회전 | 낮음 |
| RotateToNearestTarget | EodSkillEventRotateToNearestTarget | 최근접 타겟 자동 회전 | 중 (오토에임) |
| CreateProjectile | EodSkillEventCreateProjectile | 투사체 생성 (param2=각도, socket=발사 본) | 최고 |
| CreateMonster | EodSkillEventCreateMonster | 적 몬스터 소환 | 낮음 |
| CreateAllyMonster | EodSkillEventAllyCreateMonster | 아군 소환 (펫) | 중 |
| ShakeCamera | EodSkillEventShakeCamera | 카메라 흔들림 | 최고 |
3.3 EntitySkillComponent (EodEntitySkillComponent.cs, 1794줄)
baseSkills: List<Skill>(기본 공격 콤보 — 인덱스 순환)equipSkills: List<Skill>(장착 액티브 4슬롯)selectedUsingSkill: Skill(현재 시전 중)currentBaseSkillComboIndex(콤보 1단→2단→3단 순환)comboResetRemainTime(콤보 리셋 카운트다운)- 7 EventBase 등록: FindUsableSkill / FindUsableDashSkill / FindUsableBaseSkill / GetUsableSkill / DoBaseAttack / DoAttack / GetEquipSkills
서브 스킬 흐름:
- 메인 스킬 시전 →
subSkillStartCheck = true data.subSkillStartTime경과 →subSkillUseTiming = true- UI
pUI.SetSubButtonShow(SkillLaneIndex, 3.0f)— 3초 안 누르면 서브 발동, 안 누르면 자동 비활성 - 메인-서브 = 디아블로 4 의 「2단 콤보 스킬」과 유사
4. EventBase 발행-구독 시스템
Entity/Event/EodEntityEventType.cs 의 34 eType + 35 EventBase 클래스 (EodEntityEvent.cs)
EventBase (abstract)
├─ OnDataLoaded / OnModelLoaded / ActivateEntity (생명주기)
├─ DoBaseAttack / DoAttack / OnSkillUsed (스킬 트리거)
├─ FindUsableSkill / FindUsableDashSkill / FindUsableBaseSkill / GetUsableSkill / GetEquipSkills (스킬 조회)
├─ OnHit / OnCollideProjectile / OnDamaged (피격 손맛 핵심)
├─ ShakeCamera (카메라 흔들림)
├─ MoveDirection / NormalMove / RotateDirection / RotateToNearestTarget / UpdateMoveForward / UpdateJoysticSkillMove / UpdateTeleport (이동)
├─ OnUpdateMeasuringStatus (능력치 갱신)
├─ GetSocketTransform (본 소켓 조회 = 발사 위치)
├─ UseAI / UseCameraEnterAI / InputChanged (제어)
├─ DoSetupItemInventory / EquipItems (장비)
└─ ContentsGo / ContentsUIReset (씬)
EodEntityEventManager + EodEntityEventPool (오브젝트 풀) → GC 압박 최소 설계. Unity 6 에서도 동일 패턴 유효.
5. 데이터 흐름
CSV (Datasheets/)
↓ [SCSV Loader]
EodDataTableSkill / SkillEvent / SkillType / SkillLevelup / SkillLevelUseData
/ PassiveSkill / SuccessionSkill / OccupationSkillSetting / GuildSkill (9 테이블)
↓ [EodGameDatascriptManager.Get]
런타임 GameDatascript.Skill 데이터 객체
↓ [Skill.BuildSkillEventLists]
SkillEventBuilder.CreateSkillEvent (팩토리, switch 13 case)
↓
List<TimeEvent> (스킬마다 N개)
↓ [Update 매 프레임]
elapsedTime 비교 → eventStartTime ≤ elapsed ≤ eventStartTime+duration → Start/Update/End
v3.0 #3 DB 통합 영향: CSV → FlatBuffer (Self-build, 정현우 50h Sp-W01~W04 분산) 로 변환. SkillEventBuilder 의 data.param1/2/3 파싱 로직 보존, FlatBuffer schema 만 추가.
6. 의존성 트리
EodEntity (god 노드)
├─ EodEntityCombatComponent (전투 처리, 2499줄)
│ ├─ EodAbilityStatus (능력치)
│ ├─ EodMatrixTrail × 2 (좌/우) ← Xft 외부 의존
│ └─ EodHUDDamageManager (회피/데미지 텍스트)
├─ EodEntitySkillComponent (스킬 보유, 1794줄)
│ └─ List<Skill> → List<TimeEvent>
├─ EodEntityComboHitComponent (콤보 UI, 95줄)
│ └─ EodUIComboHit (Addressable 비동기)
├─ EodEntityShakeCameraComponent (카메라 흔들림 수신)
│ └─ EodCamera.Get.ShakeCamera (싱글톤)
├─ EodEntityMatrixEffectComponent (잔상 복제, 188줄)
│ └─ EodEntityAnimationComponent (Animator 의존)
├─ EodEntityActionComponent (Action TimeEvent — Skill 과 중복)
├─ EodEntityAnimationComponent (Animator + AnimatorStateInfo)
├─ EodEntityModelComponent (모델 root)
└─ EodEntityEventManager (발행-구독)
└─ EodEntityEventPool (GC 풀)
god 노드: EodEntity (community 6 본 도메인). 컴포넌트 19개를 single EodEntity 가 owner. Unity 6 포팅 시 EodEntity 부터 마이그레이션 후 컴포넌트 순차 권고.
7. 2019.4 → Unity 6 호환성 평가
| 항목 | 사용 | Unity 6 상태 | 패치 필요 |
|---|---|---|---|
MonoBehaviour | 모든 Component | OK | X |
Animator / AnimatorStateInfo | EodEntityMatrixEffect / Skill | OK | X |
Time.deltaTime / Time.realtimeSinceStartup | 전체 | OK | X |
Coroutine / IEnumerator yield return | EodEntityMatrixEffect | OK (Awaitable 권장) | 선택 |
Instantiate / Destroy | 전체 | OK | X |
Resources.Load | 미사용 (Addressable 이미 적용) | OK | X |
Addressables.LoadAsync | EodUIManager.GenerateUIUnitAsync | Addressables 2.x 호환 | 콜백 패턴 → async/await 권장 |
Xft.XWeaponTrail | EodMatrixTrail | 미보증, 2014 stale | 대체 또는 검증 필요 |
UnityEngine.Random.Range | Skill 회피 / 잔상 | OK | X |
Vector3 / Quaternion | 전체 | OK | X |
string.Parse (data.param1) | SkillEventBuilder | OK | FlatBuffer 후 strongly-typed 권고 |
Debug.Log 잔존 | 다수 | OK | 빌드 시 제거 권고 |
Random = UnityEngine.Random 별칭 | EodEntityCombatComponent | OK | X |
호환성 종합: ~85% drop-in 가능. Xft 1건 + Addressable async/await 1건 = 2건만 패치하면 99% 동작.
8. 라이브 안정성 (정현우 본 영역) 위험 요소
- EodEntityCombatComponent 2499줄 — 단일 클래스 god 클래스. 라이브 패치 시 회귀 위험 높음. 포팅 시 분리 권고:
CombatStateMachine/DamageCalculator/MatrixTrailController/HitDetection4 sub-class. - EodEntitySkillComponent 1794줄 — 동일 god 클래스 위험.
- EodEntityMatrixEffectComponent 디버그 코드 잔존 (5초 주기 자동 발화) — 포팅 시 즉시 제거 안 하면 라이브 폭주 가능.
- 하드코딩:
m_nMaxCombo = 100(ComboHit)ComboDuration = 3.0f(ComboHit)SetSubButtonShow 3.0f(서브 스킬 시간)- 어픽스/시즌 변동 가능성 → SO 빼기 필수.
- TimeCtrlSpeed × AttackRatio 이중 곱 — 균형 무너지면 손맛 망가짐. Sp02 W1 PP-only 잠금 (메모리
project_milestone_bonus_pct_pp_only_lock.md) 와 정합 검증 필요 — 윤서아(game-designer) 협업 슬롯.
9. 200F 4.255 baseline 영향 평가
전투 시스템 자체는 DPS 곡선에 직접 영향 X (이펙트/UI 레이어). 단:
attackSpeedRatio(AttackRatio × TimeCtrlSpeed) 변동 → DPS 영향cooldownTime쿨감 % 적용 → DPS 영향- 이 2 변수는
EodAbilityStatus(능력치) 에서 결정 → 윤서아 영역. - 본 분석은 baseline 0% 영향. 한가영(web-game-balance) 주 1회 회귀 검증과 무관.
10. 정현우 권고
- A안 = 그대로 가져오기 권고 (포팅 전략 v1 §3 참조)
- 분할 마이그레이션 Phase 4 (2027-04+) 진입 시 1주 1 컴포넌트 페이스
- Xft 의존 제거 + Unity 6 내장 TrailRenderer 대체 (~200 LOC, 1주 분량)
- EodEntityMatrixEffectComponent 디버그 5초 자동 발화 즉시 제거
- god 클래스 2건 (Combat 2499 / Skill 1794) 분할 Sp02 재개 (9/15) 후 Unity 측 작업 시 진행
- CSV → FlatBuffer 마이그레이션 Sp-W01~W04 50h 작업과 통합 (이미 잠금)
- 한지우(graphics-lead) 협업 슬롯: 잔상 복제 Stencil/Ghost Material 시드 + Camera Shake 셰이더 (모션 블러) 검토
11. 다음 세션 첫 액션
- EodCamera.cs 본체 read (ShakeCamera 함수 본체 + 흔들림 알고리즘 = sin/perlin/dampen 결정 매트릭스)
- EodActionEventShakeCamera vs EodSkillEventShakeCamera 차이점 비교
- EodProjectile.cs read (Damage Detection 흐름 = AttPow / DefPow / QuickDetection)
- CSV
CameraShake.csv실 데이터 sample 5건 매핑 (param 의미) - Xft.XWeaponTrail Unity 6 호환 PoC 1h (또는 대체안)
- 한지우 협업 발주 슬롯 Sp01 W2 종료 (5/17) 후 박세린(PM) 경유
산출물 묶음:
combat_system_porting_strategy_v1_2026-05-05.md(A/B/C 3안)combat_system_core_assets_inventory_v1_2026-05-05.md(~50 파일 매트릭스)combat_system_pd_briefing_1page_2026-05-05.md(PD 출장 복귀 1쪽)