본문으로 건너뛰기
Unreal Engine GAS(Gameplay Ability System) 심화LESSON 28

투사체 Ability, TargetData, 명중 판정

난이도심화
예상 시간220분
선수지식27강의 서버 타격 판정

28강. 투사체 Ability, TargetData, 명중 판정

1. 이번 강의에서 해결할 문제​

Client가 보낸 Impact Point로 서버 투사체를 바로 Spawn하면 뒤를 향해 쏘거나 벽 너머 Target을 지정할 수 있습니다. Client와 서버가 각각 Projectile을 Spawn하면 중복 Actor와 이펙트가 생깁니다.

2. 학습 목표​

3. 핵심 개념​

TargetData는 다형 Target 정보를 값으로 직렬화할 수 있지만 신뢰 증명은 아닙니다. 소유 Client의 카메라 조준과 서버 Avatar 위치 차이를 허용 범위 안에서 조정하고, 최종 Spawn Transform과 Hit는 서버가 결정합니다.

4. 구현​

GA_FireProjectile.cpp
void UGA_FireProjectile::SpawnValidatedProjectile(
const FGameplayAbilityTargetDataHandle& TargetData)
{
AActor* Avatar = GetAvatarActorFromActorInfo();
if (!Avatar || !HasAuthority(&CurrentActivationInfo)) return;

const FVector Muzzle = ResolveServerMuzzleLocation(Avatar);
const FVector Requested = ExtractTargetPoint(TargetData);
FVector Direction = (Requested - Muzzle).GetSafeNormal();

const float Dot = FVector::DotProduct(
Avatar->GetActorForwardVector(), Direction);
if (Dot < MinForwardDot || !ValidateAimLine(Muzzle, Requested)) return;

FTransform SpawnTransform(Direction.Rotation(), Muzzle);
AGASProjectile* Projectile = GetWorld()->SpawnActorDeferred<AGASProjectile>(
ProjectileClass, SpawnTransform, Avatar, Cast<APawn>(Avatar),
ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
if (!Projectile) return;

Projectile->InitializeDamageSpec(BuildDamageSpec());
Projectile->FinishSpawning(SpawnTransform);
}

Projectile는 서버에서 bReplicates=true로 Spawn되고 충돌 시 Target ASC에 보관한 Spec을 적용한 뒤 파괴됩니다. Client는 예측 Ghost를 선택적으로 표시할 수 있지만 실제 Damage Projectile과 식별·정리 경로를 분리합니다.

5. 코드가 동작하는 이유​

서버가 자신의 Muzzle과 Forward를 기준으로 Client 요청 각도와 시야를 제한합니다. Deferred Spawn 중 Effect Spec과 Source를 설정한 뒤 복제 Actor로 완성해 모든 Client가 같은 Projectile 원본을 관찰합니다.

6. 실패 사례와 해결​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

투사체 Ability, TargetData, 명중 판정 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“투사체 Ability, TargetData, 명중 판정” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2‘TargetData를 신뢰’ 실수를 판단할 때 “투사체 Ability, TargetData, 명중 판정” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

28강. 투사체 Ability, TargetData, 명중 판정 미완료 상태