타기팅, Confirm, Cancel 흐름 설계하기
31강. 타기팅, Confirm, Cancel 흐름 설계하기
1. 이번 강의에서 해결할 문제
타기팅은 조준 UI를 빠르게 보여 주는 클라이언트 흐름과 실제 명중을 결정하는 서버 흐름이 만나는 지점입니다. 클라이언트가 보낸 위치를 그대로 믿으면 벽 너머 공격과 사거리 조작을 막을 수 없고, Confirm·Cancel 정리를 놓치면 입력과 프리뷰 액터가 남습니다.
2. 학습 목표
3. 핵심 개념
FGameplayAbilityTargetDataHandle은 단일 타입이 아니라 HitResult, 위치, 액터 집합 같은 타깃 정보를 담는 핸들입니다. 소유 클라이언트는 로컬 조준과 프리뷰를 담당하고, 서버는 수신한 TargetData를 권한 있는 월드 상태로 검증한 뒤 Effect를 적용합니다. 다른 클라이언트는 확정된 Effect·Attribute·Cue만 관찰합니다.
4. 구현
void UGA_TargetedStrike::ActivateAbility(
const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
auto* Task = UAbilityTask_WaitTargetData::WaitTargetData(
this, TEXT("StrikeTarget"), EGameplayTargetingConfirmation::UserConfirmed,
TargetActorClass);
Task->ValidData.AddDynamic(this, &ThisClass::HandleConfirmed);
Task->Cancelled.AddDynamic(this, &ThisClass::HandleCancelled);
Task->ReadyForActivation();
}
void UGA_TargetedStrike::HandleConfirmed(const FGameplayAbilityTargetDataHandle& Data)
{
if (!ValidateTargetDataOnServer(Data))
{
CancelAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true);
return;
}
ApplyGameplayEffectSpecToTarget(CurrentSpecHandle, CurrentActorInfo,
CurrentActivationInfo, Data, MakeOutgoingGameplayEffectSpec(DamageEffectClass));
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, false);
}
검증 함수는 Avatar 위치 기준 최대 거리, 서버 Trace의 차폐 결과, 대상의 생존·팀·충돌 채널을 확인합니다. Confirm과 Cancel 입력은 Enhanced Input에서 ASC의 타깃 확인/취소 입력으로 전달하고, Ability 종료 시 TargetActor와 프리뷰를 반드시 제거합니다. 엔진 버전에 따라 TargetActor API 시그니처가 달라질 수 있으므로 현재 UE5 헤더를 기준으로 맞춥니다.
5. 코드가 동작하는 이유
로컬 플레이어는 입력 즉시 커서와 범위를 갱신하지만 최종 적용은 권한 서버에서만 일어납니다. Task가 Ability 종료와 함께 Delegate를 정리하므로 Cancel, 사망, Avatar 교체에서도 타기팅 상태가 남지 않습니다. Confirm은 의사 표현이지 판정 결과가 아닙니다.
6. 실패 사례와 해결
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
타기팅, Confirm, Cancel 흐름 설계하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.