Collision Event와 Trace
14강. Collision Event와 Trace
1. 이번 강의에서 해결할 문제
근접 공격을 Overlap Begin만으로 처리하니 범위 안에 이미 있던 적을 공격하지 못하거나 한 번의 공격에 여러 번 피해가 들어갑니다. 지속 영역과 순간 질의를 구분합니다.
2. 학습 목표
3. 핵심 개념
Overlap Event는 Actor가 영역에 들어오고 나가는 상태 변화에 적합합니다. Trace는 공격 버튼을 누른 순간처럼 특정 시점에 공간을 질문할 때 적합합니다. 공식 Traces Overview는 Line과 Shape Trace, Channel과 Object Type 기준을 설명합니다.
이 실습은 Sphere Sweep Multi를 사용해 플레이어 전방의 여러 적을 찾습니다. 같은 Actor에 여러 Component가 맞을 수 있으므로 TSet으로 중복 피해를 막습니다.
4. 단계별 실습
파일 경로: Source/TopDownSurvival/Characters/SurvivalCharacter.h · 공격 필드
UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ClampMin = "0.0"))
float AttackDamage = 25.0f;
UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ClampMin = "1.0", Units = "cm"))
float AttackRadius = 120.0f;
UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ClampMin = "0.0", Units = "cm"))
float AttackDistance = 100.0f;
파일 경로: Source/TopDownSurvival/Characters/SurvivalCharacter.cpp
#include "DrawDebugHelpers.h"
#include "Kismet/GameplayStatics.h"
void ASurvivalCharacter::PerformAttack()
{
const FVector Start = GetActorLocation();
const FVector End = Start + GetActorForwardVector() * AttackDistance;
FCollisionQueryParams QueryParams(SCENE_QUERY_STAT(PlayerAttack), false, this);
TArray<FHitResult> Hits;
const FCollisionShape Shape = FCollisionShape::MakeSphere(AttackRadius);
const bool bHit = GetWorld()->SweepMultiByChannel(
Hits,
Start,
End,
FQuat::Identity,
ECC_Pawn,
Shape,
QueryParams);
TSet<AActor*> DamagedActors;
if (bHit)
{
for (const FHitResult& Hit : Hits)
{
AActor* HitActor = Hit.GetActor();
if (IsValid(HitActor) && !DamagedActors.Contains(HitActor))
{
DamagedActors.Add(HitActor);
UGameplayStatics::ApplyDamage(
HitActor, AttackDamage, GetController(), this, nullptr);
}
}
}
#if ENABLE_DRAW_DEBUG
DrawDebugSphere(GetWorld(), End, AttackRadius, 20, FColor::Red, false, 1.0f);
#endif
}
Unreal Editor
플레이어 Capsule과 적 Capsule이 Pawn Channel 질의에 Block 또는 Overlap으로 응답하는지 확인합니다. 프로젝트 전용 Attack Trace Channel을 만드는 확장은 가능하지만, 먼저 기본 Pawn 채널로 흐름을 검증합니다.
5. 코드가 동작하는 이유
SweepMultiByChannel은 Start에서 End까지 Sphere를 이동시키며 응답하는 Component를 모두 수집합니다. QueryParams에 this를 넣어 공격자 자신을 제외합니다. TSet은 여러 Component가 같은 Actor를 반환해도 한 번만 ApplyDamage하게 합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Collision Event와 Trace 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.