🎮

「UnrealEngine」OnComponentBeginOverlapでImpactPointが取れない

2023/12/31に公開

発生した問題

  • OnComponentBeginOverlap()で当たり判定をした際に、引数の SweepResultImpactPoint が(0,0,0)になり、ヒット位置でVFXの再生などができなかった。

原因

解決方法

  • リンク先にも答えがあるが、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