AActor* USCarryObjectComponent::GetActorInView() { APawn* PawnOwner = Cast<APawn>(GetOwner()); AController* Controller = PawnOwner->Controller; if (Controller == nullptr) { return nullptr; } FVector CamLoc; FRotator CamRot; Controller->GetPlayerViewPoint(CamLoc, CamRot); const FVector TraceStart = CamLoc; const FVector Direction = CamRot.Vector(); const FVector TraceEnd = TraceStart + (Direction * MaxPickupDistance); FCollisionQueryParams TraceParams(TEXT("TraceActor"), true, PawnOwner); TraceParams.bTraceAsyncScene = true; TraceParams.bReturnPhysicalMaterial = false; TraceParams.bTraceComplex = false; FHitResult Hit(ForceInit); GetWorld()->LineTraceSingleByChannel(Hit, TraceStart, TraceEnd, ECC_Visibility, TraceParams); /* Check to see if we hit a staticmesh component that has physics simulation enabled */ UStaticMeshComponent* MeshComp = Cast<UStaticMeshComponent>(Hit.GetComponent()); if (MeshComp && MeshComp->IsSimulatingPhysics()) { return Hit.GetActor(); } return nullptr; }
void USCarryObjectComponent::OnPickupMulticast_Implementation(AActor* FocusActor) { if (FocusActor && FocusActor->IsRootComponentMovable()) { /* Find the static mesh (if any) to disable physics simulation while carried Filter by objects that are physically simulated and can therefor be picked up */ UStaticMeshComponent* MeshComp = Cast<UStaticMeshComponent>(FocusActor->GetComponentByClass(UStaticMeshComponent::StaticClass())); if (MeshComp && MeshComp->IsSimulatingPhysics()) { MeshComp->SetCollisionEnabled(ECollisionEnabled::QueryOnly); MeshComp->SetSimulatePhysics(false); } FocusActor->AttachToComponent(this, FAttachmentTransformRules::KeepWorldTransform); } }