버스트 스킬 & GAS 콤보 디버깅
1. 투사체(ABurstProjectile) & 월드 액터(ABurstWorldActorBase) 베이스 작성
- ABurstProjectile: 검기 투사체.
SpawnActorDeferred → Initialize → FinishSpawning → Launch순으로 생성. Overlap 시 Instigator의PlayerBurstComponent::ReportProjectileHit호출.ApplyHitToTarget이 private라 접근 불가 → public 래퍼ReportProjectileHit추가로 해결.
- ABurstWorldActorBase: 화염검/물기둥 같은 소환물. C++엔 SceneRoot만, 비주얼(Mesh/Niagara)은 BP에서. 등장 모션은
SpawnHeightOffset(양수=위→아래, 음수=아래→위) + Tick 보간.
2. (핵심) PlayMontageAndWait 의 OnBlendOut 미연결 버그
증상
- 버스트/공격을 쓰고 나면 가끔 어빌리티가 EndAbility 없이 활성 상태로 영구 잔류 → 이후 같은 어빌리티가 발동 안 됨.
원인
UAbilityTask_PlayMontageAndWait는 몽타주 종료 경로마다 다른 델리게이트를 쏜다.
OnCompleted/Interrupted/Cancelled만 연결하고 OnBlendOut을 빠뜨리면, 몽타주가 BlendOut으로 끝나는 경우 콜백이 안 불려서 EndAbility가 호출되지 않는다.
진단 흐름 (입력이 안 먹힐 때)
ASC::AbilityInputTagPressed로그 → 입력이 ASC까지 오는지ProcessAbilityInput에서IsActive()체크 → 활성 잔류면TryActivate자체를 생략 →CanActivateAbility로그조차 안 뜸- "로그가 아예 안 뜬다 = 입력 문제", "spec은 매칭되는데 IsActive=true = 활성 잔류" 로 구분
해결
MontageTask->OnCompleted.AddDynamic(this, &ThisClass::HandleMontageCompleted);
MontageTask->OnBlendOut.AddDynamic(this, &ThisClass::HandleMontageCompleted); // ← 빠뜨리지 말 것
MontageTask->OnInterrupted.AddDynamic(this, &ThisClass::HandleMontageInterrupted);
MontageTask->OnCancelled.AddDynamic(this, &ThisClass::HandleMontageCancelled);
OnBlendOut+OnCompleted가 둘 다 불려도, 먼저 실행된 쪽이EndTask()/StartComboStep()으로 태스크를 교체하므로 뒤 콜백은 무효화됨 → 중복 안 됨.- EndAbility 오버라이드엔
IsEndAbilityValid()가드를 둬서 중복 cleanup 방지.
기타
- enum 값 이름 변경(
GroundEruption→WorldActor) 시 이미 저장된 데이터 테이블 값은 자동 변환 안 됨 → 에디터에서 다시 선택하거나 Core Redirects 필요. bRotationFollowsVelocity = true는 발사 시 메시 회전을 속도 방향으로 정렬하면서 Roll(기울임)을 0으로 덮어씀. 검기 기울임을 유지하려면 false.