🎮
「UnrealEngine」OnComponentBeginOverlapでImpactPointが取れない
発生した問題
- OnComponentBeginOverlap()で当たり判定をした際に、引数の SweepResult の ImpactPoint が(0,0,0)になり、ヒット位置でVFXの再生などができなかった。
原因
- こちらでも同様の質問があった
- https://forums.unrealengine.com/t/on-component-begin-overlap-sweep-result-not-populated/305294
- ライントレースか、通常の物理的なコリジョンでないと取れない模様。
解決方法
- リンク先にも答えがあるが、SweepMultiByObjectType()を行い、無理やりImpactPointを作成する
void AOverlapTest::ComponentBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (IsValid(OtherActor) && (OtherActor != this) && IsValid(OtherComp))
{
if (this != OtherActor)
{
// OnComponentBeginOverlap()だと衝突点が取れない仕様なので、SweepMultiByObjectType()で取る必要がある
TArray<FHitResult> all_results;
FVector start = GetActorLocation();
FVector end = OtherComp->GetComponentLocation();
float collision_radius = FVector::Dist(start, end) * 1.1f;
GetWorld()->SweepMultiByObjectType(
all_results,
start,
end,
FQuat::Identity,
0,
FCollisionShape::MakeSphere(collision_radius),
FCollisionQueryParams::FCollisionQueryParams()
);
for (const FHitResult& hit : all_results)
{
if (OtherComp->GetUniqueID() == hit.GetComponent()->GetUniqueID())
{
FVector hit_location = hit.ImpactPoint;
FVector hit_normal = hit.ImpactNormal;
float offset_distance = 7.0f; // 衝突地点からのオフセット距離
// 衝突地点から少し離れた位置を計算
FVector spawn_location = hit_location + hit_normal * offset_distance;
// ビジュアルエフェクト
if (IsValid(hitVfx))
{
UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), hitVfx, spawn_location);
break;
}
}
}
}
}
}
Discussion