내일배움캠프_Unreal/TIL

내일배움캠프_Unreal/TIL - Day 147 (260701)

하임 2026. 7. 1. 20:47

Burst Phase Dash


1. 이동 파라미터를 "행 단위"에서 "타격 단위(per-hit)"로 이관

문제: 한 버스트 안에서 이동 페이즈를 못 나눔

WindBurst는 "솟구쳐 오른 뒤 → 전방으로 다이브" 처럼 이동이 두 페이즈로 나뉨. 그런데 대시 값(거리/시간/상승)이 스킬 행(FSkillCombination)에 하나만 있어 한 세트밖에 못 씀.

해결: 대시 값을 각 타격(FBurstHitInstance)으로 내림

HitSequenceHitIndex별로 다른 이동을 주도록 per-hit 오버라이드를 추가. HitIndex 0 = 순수 상승, HitIndex 1 = 전방+하강.

// FBurstHitInstance (per-hit 오버라이드)
bool  bOverrideDashMotion = false;
float DashForwardDistance = 0.f;  // 음수 = 후방
float DashUpwardSpeed     = 0.f;  // 양수 = 상승 / 음수 = 하강
float DashLaunchDuration  = 0.2f; // 발사 속도 = 거리 / 시간
  • 주의 ⚠️: 공용 실행 spec(FAttackExecutionSpec)의 행 단위 대시는 Heavy 등도 쓰므로 유지. 버스트 행(FSkillCombination)에서만 제거 → 실행기는 bOverrideDashMotion이면 per-hit, 아니면 spec 폴백으로 이원화.
// DoDashHit — per-hit이면 타격 값, 아니면 spec(행) 값으로 폴백
const bool  bPerHitDash = Hit.bOverrideDashMotion;
const float DashDistance = bPerHitDash ? Hit.DashForwardDistance : ActiveSpec.DashDistance;
const float DashUpwardSpeed = bPerHitDash ? Hit.DashUpwardSpeed : ActiveSpec.DashUpwardSpeed;

교훈: 한 액션 안에서 단계마다 값이 달라져야 하면 그 값을 "행(1세트)"이 아니라 "타격 시퀀스(N개)"로 내린다. 기존 공용 경로는 지우지 말고 폴백으로 남겨 다른 공격(Heavy)이 계속 쓰게 한다.


2. 상승 성분엔 bOverrideZ — 수평/수직 합성 발사

전방 속도(수평) + 상승/하강 속도(수직)를 한 벡터로 합성해 발사. 여기서 LaunchCharacter의 Z 덮어쓰기 여부가 핵심.

FVector LaunchVelocity = Forward * (DashDistance / DashLaunchDuration);
LaunchVelocity.Z += DashUpwardSpeed;
// 상승 성분이 있으면 Z도 덮어써야 실제로 떠오름. 순수 전방이면 기존 낙하 Z 보존.
URetrieveKnockbackLibrary::LaunchSelf(Character, LaunchVelocity.GetSafeNormal(),
    LaunchVelocity.Size(), /*bOverrideXY=*/true, /*bOverrideZ=*/bHasUpward);

❌ Before — 순수 전방만 가정, Z는 항상 보존

LaunchSelf(Character, Forward, Speed, /*bOverrideXY=*/true, /*bOverrideZ=*/false);

✅ After — 상승이 있을 때만 Z를 덮어써 실제로 떠오르게

  • 트러블슈팅: bOverrideZ=false면 상승 속도를 줘도 기존 수직 속도/중력에 묻혀 안 떠오름. 상승 성분(bHasUpward)이 있을 때만 true.
  • ⚠️ 애님 세팅 전제: 다이브 애님은 Root Motion OFF + Force Root Lock이어야 함. 안 그러면 루트모션이 이동 소유권을 가져가 LaunchCharacter팝백됨.

비교 정리

구분 ❌ Before ✅ After
버스트 이동 값 행(FSkillCombination) 1세트 per-hit(FBurstHitInstance) → 상승/다이브 페이즈 분리
공용 실행기 대시 행 값만 spec 폴백 유지 (Heavy 등이 씀)
발사 방향 전방(수평)만 수평 + 수직(상승/하강) 합성
상승 발사 Z 항상 보존(bOverrideZ=false) 상승 성분 있으면 bOverrideZ=true

핵심 요약

  • 한 액션 안에서 단계마다 이동이 달라지면 값을 행(1세트) → 타격 시퀀스(per-hit)로 내린다. 기존 공용 경로는 지우지 말고 폴백으로 남겨 다른 공격이 계속 쓰게.
  • 전방+상승을 한 벡터로 합성해 발사하고, 상승 성분이 있을 때만 bOverrideZ=true(아니면 안 떠오름).
  • LaunchCharacter로 띄우는 다이브 애님은 Root Motion OFF / Force Root Lock 필수 — 안 그러면 팝백.