Rayを当てたりして取得したアクターUPhysicsHandleComponent
のGrabComponentAtLocationWithRotation
を使って物体を取得し保持することはよくある方法だと思いますが正常に取得できないことがあります。それの解決方法の備忘録。
grabActorSample.cpp
UPhysicsHandleComponent* handle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
if (handle == nullptr) return;
UPrimitiveComponent* hitComponent = hitResult.GetComponent();
handle->GrabComponentAtLocationWithRotation(
hitComponent,
NAME_None,
result.ImpactPoint,
GetComponentRotation()
);
原因
取得したオブジェクトのPhysicsが寝てしまっている。
解決方法
UPrimitiveComponent
のWakeAllRigidBodies
を使って、取得したオブジェクトを起こしてやります。
grabActorAwakedSample.cpp
UPhysicsHandleComponent* handle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
if (handle == nullptr) return;
UPrimitiveComponent* hitComponent = hitResult.GetComponent();
hitComponent->WakeAllRigidBodies(); //これを追加
handle->GrabComponentAtLocationWithRotation(
hitComponent,
NAME_None,
result.ImpactPoint,
GetComponentRotation()
);
簡単だけど知らないとはまる。
因みにリリースする時も同様
releaseActorAwakedSample.cpp
UPhysicsHandleComponent* handle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
if (handle == nullptr) return;
// Release grabbed object
if (handle->GetGrabbedComponent())
handle->GetGrabbedComponent()->WakeAllRigidBodies();
handle->ReleaseComponent();
おしまい。