1. 개요
몬스터들이 칼을 휘두르는 공격은 ApplyDamage 혹은 ApplyPointDamage로 처리가 가능하다. 하지만 수류탄, 미사일처럼 폭파하는 로직들이 포함된 공격은 어떻게 구현해야 할까 ?
언리얼 엔진에는 **ApplyRadialDamage** 함수가 있다.
2. ApplyRadialDamage
UGameplayStatics::ApplyRadialDamage(
GetWorld(),
ExplosionDamage, // 폭발 데미지
GetActorLocation(), // 폭발 시작점
ExplosionRadius, // 폭발 반경
UDamageType::StaticClass(), // 데미지 타입
TArray<AActor*>(), // 제외할 액터
this, // 폭발을 발생시킨 주체
GetController(), // 폭발을 발생시킨 컨트롤러
false, // 범위에 따라 데미지를 다르게 적용하지 않을 건지
ECollisionChannel::ECC_WorldStatic // WorldStatic 콜리전 채널 뒤에 숨은 경우 데미지 처리 x
);
인자가 정말 많이 포함되어있다.
3. 최종 코드
void ABlowfish::Explosion()
{
// 폭발 디버그 구체 그리기 (파란색, 1초 동안 표시)
DrawDebugSphere(
GetWorld(),
GetActorLocation(),
ExplosionRadius,
32, // 세그먼트 수 (더 높이면 원형이 매끄러워짐)
FColor::Red, // 색상
false, // 지속 여부 (true: 영구)
1.0f // 표시 시간 (초)
);
TArray<FOverlapResult> Overlaps;
FCollisionQueryParams Params;
Params.AddIgnoredActor(this); // 자기 자신은 제외
// 충돌 설정: Pawn 채널 탐지
GetWorld()->OverlapMultiByChannel(
Overlaps,
GetActorLocation(),
FQuat::Identity,
ECC_Pawn,
FCollisionShape::MakeSphere(ExplosionRadius),
Params
);
// 충돌 범위 내에 있는 플레이어들 넉백
for (const FOverlapResult& Result : Overlaps)
{
AUnderwaterCharacter* Player = Cast<AUnderwaterCharacter>(Result.GetActor());
if (IsValid(Player))
{
float Power = LaunchPower * 5.0f;
LaunchPlayer(Player, Power);
}
}
// 복어 위치를 기준으로 ExplosionRadius 범위내에 있는 액터에게 ExplosionDamage를 가함
// ECC_WorldStatic으로 프리셋이 설정된 액터에 가려진 경우 데미지를 받지 않음
UGameplayStatics::ApplyRadialDamage(GetWorld(), ExplosionDamage, GetActorLocation(), ExplosionRadius,
UDamageType::StaticClass(), TArray<AActor*>(), this, GetController(), false, ECollisionChannel::ECC_WorldStatic);
Destroy(true);
}
충돌 반경에 대한 디버그 라인을 표시하고, 충돌 반경 내에 존재하는 플레이어에게 LaunchCharacter 및 데미지를 가하는 코드이다.
'언리얼 엔진 > 트러블슈팅' 카테고리의 다른 글
| [언리얼엔진] Simulate Physics + Physics Asset (0) | 2025.05.20 |
|---|---|
| [언리얼엔진] 렌더링 최적화 팁 (0) | 2025.05.20 |
| [언리얼엔진] 경로 활용 변수 할당 (0) | 2025.05.13 |
| [언리얼엔진] BeginPlay, Tick 이벤트 관련 (0) | 2025.05.09 |
| [언리얼엔진] Git Issue, PR Template 사용법 (0) | 2025.05.07 |