내일배움캠프-언리얼

TIL - 82

이시보 2026. 6. 1. 22:10

버스트 스킬 & 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가 호출되지 않는다.

진단 흐름 (입력이 안 먹힐 때)

  1. ASC::AbilityInputTagPressed 로그 → 입력이 ASC까지 오는지
  2. ProcessAbilityInput에서 IsActive() 체크 → 활성 잔류면 TryActivate 자체를 생략CanActivateAbility 로그조차 안 뜸
  3. "로그가 아예 안 뜬다 = 입력 문제", "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 값 이름 변경(GroundEruptionWorldActor) 시 이미 저장된 데이터 테이블 값은 자동 변환 안 됨 → 에디터에서 다시 선택하거나 Core Redirects 필요.
  • bRotationFollowsVelocity = true는 발사 시 메시 회전을 속도 방향으로 정렬하면서 Roll(기울임)을 0으로 덮어씀. 검기 기울임을 유지하려면 false.

'내일배움캠프-언리얼' 카테고리의 다른 글

TIL - 84  (0) 2026.06.04
TIL - 83  (0) 2026.06.02
TIL - 81  (0) 2026.05.29
TIL - 80  (0) 2026.05.27
TIL - 79  (0) 2026.05.26