void USCarryObjectComponent::OnDropMulticast_Implementation() { AActor* CarriedActor = GetCarriedActor(); if (CarriedActor) { /* Find the static mesh (if any) to re-enable physics simulation */ UStaticMeshComponent* MeshComp = Cast<UStaticMeshComponent>(CarriedActor->GetComponentByClass(UStaticMeshComponent::StaticClass())); if (MeshComp) { MeshComp->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); MeshComp->SetSimulatePhysics(true); } CarriedActor->GetRootComponent()->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform); } }
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); } }