← 자료실/designsLOW

전투 시스템 분석 v1 — Program/Client 원본 (2019.4 LTS)

designs/combat_system_analysis_v1_2026-05-05.md

전투 시스템 분석 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 진입점

진입점위치트리거
EodSkillEventShakeCameraSkill/EodSkillEventShakeCamera.cs스킬 TimeEvent 시작 시 (param1=shakeEventKey)
EodActionEventShakeCameraAction/EodActionEventShakeCamera.cs액션 TimeEvent (Skill 외 일반 액션)
EodProjectileEventShakeCameraProjectile/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)

2.3 Matrix Trail = 무기 궤적 트레일 (Xft.XWeaponTrail wrapper)

2.4 잔상 복제 시스템 (Motion Effect)

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 + 쿨감 % 적용

핵심 패턴:

  1. CSV Skill.generalTypeCode → SkillEvent 테이블 unitList → SkillEventBuilder.CreateSkillEvent 팩토리 → 13 종류 TimeEvent 인스턴스화
  2. Update() 에서 elapsedTime / fLastAttackSpeedRatio 비교 → 시간 기반 이벤트 발화
  3. attackSpeedRatio = AttackRatio × TimeCtrlSpeed 동시 적용 — 공속과 슬로우/배속 효과 결합

3.2 13 SkillEvent 종류 (SkillEventBuilder.cs)

eSkillEventType클래스용도손맛 영향도
MoveForwardEodSkillEventMoveFoward직선 이동중
MoveDirectionEodSkillEventMoveDirection입력 방향 이동중
MoveToNearestTargetEodSkillEventMoveToNearestTarget최근접 타겟 돌진높음 (대시 손맛)
MoveForwardAutoToNearTargetEodSkillEventMoveDirectAutoToNearTarget소용돌이 (이동 중 컨트롤)중
TeleportForwardEodSkillEventTeleportFoward순간이동 전방높음
TeleportBackEodSkillEventTeleportBack순간이동 후방 (백스텝)높음
RotateEodSkillEventRotate즉시 회전 (각도 지정)낮음
RotateDirectionEodSkillEventRotateDirection입력 방향 회전낮음
RotateToNearestTargetEodSkillEventRotateToNearestTarget최근접 타겟 자동 회전중 (오토에임)
CreateProjectileEodSkillEventCreateProjectile투사체 생성 (param2=각도, socket=발사 본)최고
CreateMonsterEodSkillEventCreateMonster적 몬스터 소환낮음
CreateAllyMonsterEodSkillEventAllyCreateMonster아군 소환 (펫)중
ShakeCameraEodSkillEventShakeCamera카메라 흔들림최고

3.3 EntitySkillComponent (EodEntitySkillComponent.cs, 1794줄)

서브 스킬 흐름:

  1. 메인 스킬 시전 → subSkillStartCheck = true
  2. data.subSkillStartTime 경과 → subSkillUseTiming = true
  3. UI pUI.SetSubButtonShow(SkillLaneIndex, 3.0f) — 3초 안 누르면 서브 발동, 안 누르면 자동 비활성
  4. 메인-서브 = 디아블로 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모든 ComponentOKX
Animator / AnimatorStateInfoEodEntityMatrixEffect / SkillOKX
Time.deltaTime / Time.realtimeSinceStartup전체OKX
Coroutine / IEnumerator yield returnEodEntityMatrixEffectOK (Awaitable 권장)선택
Instantiate / Destroy전체OKX
Resources.Load미사용 (Addressable 이미 적용)OKX
Addressables.LoadAsyncEodUIManager.GenerateUIUnitAsyncAddressables 2.x 호환콜백 패턴 → async/await 권장
Xft.XWeaponTrailEodMatrixTrail미보증, 2014 stale대체 또는 검증 필요
UnityEngine.Random.RangeSkill 회피 / 잔상OKX
Vector3 / Quaternion전체OKX
string.Parse (data.param1)SkillEventBuilderOKFlatBuffer 후 strongly-typed 권고
Debug.Log 잔존다수OK빌드 시 제거 권고
Random = UnityEngine.Random 별칭EodEntityCombatComponentOKX

호환성 종합: ~85% drop-in 가능. Xft 1건 + Addressable async/await 1건 = 2건만 패치하면 99% 동작.

8. 라이브 안정성 (정현우 본 영역) 위험 요소

  1. EodEntityCombatComponent 2499줄 — 단일 클래스 god 클래스. 라이브 패치 시 회귀 위험 높음. 포팅 시 분리 권고: CombatStateMachine / DamageCalculator / MatrixTrailController / HitDetection 4 sub-class.
  2. EodEntitySkillComponent 1794줄 — 동일 god 클래스 위험.
  3. EodEntityMatrixEffectComponent 디버그 코드 잔존 (5초 주기 자동 발화) — 포팅 시 즉시 제거 안 하면 라이브 폭주 가능.
  4. 하드코딩:
  1. TimeCtrlSpeed × AttackRatio 이중 곱 — 균형 무너지면 손맛 망가짐. Sp02 W1 PP-only 잠금 (메모리 project_milestone_bonus_pct_pp_only_lock.md) 와 정합 검증 필요 — 윤서아(game-designer) 협업 슬롯.

9. 200F 4.255 baseline 영향 평가

전투 시스템 자체는 DPS 곡선에 직접 영향 X (이펙트/UI 레이어). 단:

10. 정현우 권고

  1. A안 = 그대로 가져오기 권고 (포팅 전략 v1 §3 참조)
  2. 분할 마이그레이션 Phase 4 (2027-04+) 진입 시 1주 1 컴포넌트 페이스
  3. Xft 의존 제거 + Unity 6 내장 TrailRenderer 대체 (~200 LOC, 1주 분량)
  4. EodEntityMatrixEffectComponent 디버그 5초 자동 발화 즉시 제거
  5. god 클래스 2건 (Combat 2499 / Skill 1794) 분할 Sp02 재개 (9/15) 후 Unity 측 작업 시 진행
  6. CSV → FlatBuffer 마이그레이션 Sp-W01~W04 50h 작업과 통합 (이미 잠금)
  7. 한지우(graphics-lead) 협업 슬롯: 잔상 복제 Stencil/Ghost Material 시드 + Camera Shake 셰이더 (모션 블러) 검토

11. 다음 세션 첫 액션


산출물 묶음: