try an alternative approach for the grab/release functionality by disabling/enabling physics simulation
This commit is contained in:
@@ -1215,14 +1215,14 @@ bool ASGPawn::IsGrabbing(const USGVirtualHandComponent* Hand, AActor*& OutActor)
|
|||||||
return Hand == HandLeft ? IsLeftHandGrabbing(OutActor) : IsRightHandGrabbing(OutActor);
|
return Hand == HandLeft ? IsLeftHandGrabbing(OutActor) : IsRightHandGrabbing(OutActor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASGPawn::GrabLeft(AActor* Actor)
|
void ASGPawn::Grab(USGVirtualHandComponent* Hand, AActor* Actor)
|
||||||
{
|
{
|
||||||
if (!ensureAlwaysMsgf(IsValid(Actor), TEXT("%s"), TEXT("ERROR: invalid actor!")))
|
if (!ensureAlwaysMsgf(IsValid(Actor), TEXT("%s"), TEXT("ERROR: invalid actor!")))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const USGGrabComponent* GrabComponent = USGGrabComponent::GetGrabComponent(Actor);
|
const USGGrabComponent* GrabComponent{USGGrabComponent::GetGrabComponent(Actor)};
|
||||||
if (!GrabComponent)
|
if (!GrabComponent)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -1238,7 +1238,23 @@ void ASGPawn::GrabLeft(AActor* Actor)
|
|||||||
const FName SocketName{GrabComponent->GetAttachmentSocketName()};
|
const FName SocketName{GrabComponent->GetAttachmentSocketName()};
|
||||||
ensureAlwaysMsgf(SocketName != NAME_None, TEXT("invalid attachment socket name!"));
|
ensureAlwaysMsgf(SocketName != NAME_None, TEXT("invalid attachment socket name!"));
|
||||||
|
|
||||||
const bool bAttached = Actor->AttachToComponent(HandLeft, MoveTemp(AttachmentRules), SocketName);
|
const USceneComponent* ActorRootComponent{Cast<USceneComponent>(Actor->GetRootComponent())};
|
||||||
|
if (!ensureAlwaysMsgf(IsValid(ActorRootComponent), TEXT("%s"), TEXT("ERROR: invalid actor's root component!")))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TArray<USceneComponent*> ActorChildrenComponents;
|
||||||
|
ActorRootComponent->GetChildrenComponents(true, ActorChildrenComponents);
|
||||||
|
for (USceneComponent* SceneComponent : ActorChildrenComponents)
|
||||||
|
{
|
||||||
|
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
|
||||||
|
if (IsValid(PrimitiveComponent))
|
||||||
|
{
|
||||||
|
PrimitiveComponent->SetSimulatePhysics(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool bAttached = Actor->AttachToComponent(Hand, MoveTemp(AttachmentRules), SocketName);
|
||||||
if (bAttached)
|
if (bAttached)
|
||||||
{
|
{
|
||||||
ActorLeftHandGrabbing = Actor;
|
ActorLeftHandGrabbing = Actor;
|
||||||
@@ -1249,40 +1265,6 @@ void ASGPawn::GrabLeft(AActor* Actor)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASGPawn::GrabRight(AActor* Actor)
|
|
||||||
{
|
|
||||||
if (!ensureAlwaysMsgf(IsValid(Actor), TEXT("%s"), TEXT("ERROR: invalid actor!")))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const USGGrabComponent* GrabComponent = USGGrabComponent::GetGrabComponent(Actor);
|
|
||||||
if (!GrabComponent)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FAttachmentTransformRules AttachmentRules{
|
|
||||||
FAttachmentTransformRules(GrabComponent->GetAttachmentLocationRule(),
|
|
||||||
GrabComponent->GetAttachmentRotationRule(),
|
|
||||||
GrabComponent->GetAttachmentScaleRule(),
|
|
||||||
GrabComponent->GetAttachmentWeldSimulatedBodies())
|
|
||||||
};
|
|
||||||
|
|
||||||
const FName SocketName{GrabComponent->GetAttachmentSocketName()};
|
|
||||||
ensureAlwaysMsgf(SocketName != NAME_None, TEXT("invalid attachment socket name!"));
|
|
||||||
|
|
||||||
const bool bAttached = Actor->AttachToComponent(HandRight, MoveTemp(AttachmentRules), SocketName);
|
|
||||||
if (bAttached)
|
|
||||||
{
|
|
||||||
ActorRightHandGrabbing = Actor;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SGLOG_ERROR("Failed to grab the actor with the right hand!", Actor, SocketName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASGPawn::ReleaseLeft()
|
void ASGPawn::ReleaseLeft()
|
||||||
{
|
{
|
||||||
if (!IsValid(ActorLeftHandGrabbing))
|
if (!IsValid(ActorLeftHandGrabbing))
|
||||||
@@ -1290,7 +1272,7 @@ void ASGPawn::ReleaseLeft()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const USGGrabComponent* GrabComponent = USGGrabComponent::GetGrabComponent(ActorLeftHandGrabbing);
|
const USGGrabComponent* GrabComponent{USGGrabComponent::GetGrabComponent(ActorLeftHandGrabbing)};
|
||||||
if (!IsValid(GrabComponent))
|
if (!IsValid(GrabComponent))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -1303,6 +1285,23 @@ void ASGPawn::ReleaseLeft()
|
|||||||
GrabComponent->GetDetachmentInCallModify())
|
GrabComponent->GetDetachmentInCallModify())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const UPrimitiveComponent* ActorRootComponent{
|
||||||
|
Cast<UPrimitiveComponent>(ActorLeftHandGrabbing->GetRootComponent())
|
||||||
|
};
|
||||||
|
if (ensureAlwaysMsgf(IsValid(ActorRootComponent), TEXT("%s"), TEXT("ERROR: invalid actor's root component!")))
|
||||||
|
{
|
||||||
|
TArray<USceneComponent*> ActorChildrenComponents;
|
||||||
|
ActorRootComponent->GetChildrenComponents(true, ActorChildrenComponents);
|
||||||
|
for (USceneComponent* SceneComponent : ActorChildrenComponents)
|
||||||
|
{
|
||||||
|
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
|
||||||
|
if (IsValid(PrimitiveComponent))
|
||||||
|
{
|
||||||
|
PrimitiveComponent->SetSimulatePhysics(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ActorLeftHandGrabbing = nullptr;
|
ActorLeftHandGrabbing = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1313,7 +1312,7 @@ void ASGPawn::ReleaseRight()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const USGGrabComponent* GrabComponent = USGGrabComponent::GetGrabComponent(ActorRightHandGrabbing);
|
const USGGrabComponent* GrabComponent{USGGrabComponent::GetGrabComponent(ActorRightHandGrabbing)};
|
||||||
if (!IsValid(GrabComponent))
|
if (!IsValid(GrabComponent))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -1326,6 +1325,23 @@ void ASGPawn::ReleaseRight()
|
|||||||
GrabComponent->GetDetachmentInCallModify())
|
GrabComponent->GetDetachmentInCallModify())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const UPrimitiveComponent* ActorRootComponent{
|
||||||
|
Cast<UPrimitiveComponent>(ActorLeftHandGrabbing->GetRootComponent())
|
||||||
|
};
|
||||||
|
if (ensureAlwaysMsgf(IsValid(ActorRootComponent), TEXT("%s"), TEXT("ERROR: invalid actor's root component!")))
|
||||||
|
{
|
||||||
|
TArray<USceneComponent*> ActorChildrenComponents;
|
||||||
|
ActorRootComponent->GetChildrenComponents(true, ActorChildrenComponents);
|
||||||
|
for (USceneComponent* SceneComponent : ActorChildrenComponents)
|
||||||
|
{
|
||||||
|
UPrimitiveComponent* PrimitiveComponent{Cast<UPrimitiveComponent>(SceneComponent)};
|
||||||
|
if (IsValid(PrimitiveComponent))
|
||||||
|
{
|
||||||
|
PrimitiveComponent->SetSimulatePhysics(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ActorRightHandGrabbing = nullptr;
|
ActorRightHandGrabbing = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ void ASGPlayerController::BeginPlay()
|
|||||||
|
|
||||||
SGPawn->OnGrabStateUpdated().AddWeakLambda(
|
SGPawn->OnGrabStateUpdated().AddWeakLambda(
|
||||||
this, [=](
|
this, [=](
|
||||||
const USGVirtualHandComponent* Hand,
|
USGVirtualHandComponent* Hand,
|
||||||
AActor* ActorThumbCanGrab, const AActor* ActorIndexCanGrab,
|
AActor* ActorThumbCanGrab, const AActor* ActorIndexCanGrab,
|
||||||
const AActor* ActorMiddleCanGrab) -> void
|
const AActor* ActorMiddleCanGrab) -> void
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class SENSEGLOVE_API ASGPawn : public APawn
|
|||||||
public:
|
public:
|
||||||
DECLARE_EVENT_FourParams(
|
DECLARE_EVENT_FourParams(
|
||||||
ASGPawn, FGrabStateUpdatedEvent,
|
ASGPawn, FGrabStateUpdatedEvent,
|
||||||
const USGVirtualHandComponent*, AActor*, const AActor*, const AActor*);
|
USGVirtualHandComponent*, AActor*, const AActor*, const AActor*);
|
||||||
|
|
||||||
FGrabStateUpdatedEvent& OnGrabStateUpdated()
|
FGrabStateUpdatedEvent& OnGrabStateUpdated()
|
||||||
{
|
{
|
||||||
@@ -631,15 +631,18 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void GrabLeft(AActor* Actor);
|
FORCEINLINE void GrabLeft(AActor* Actor)
|
||||||
|
|
||||||
void GrabRight(AActor* Actor);
|
|
||||||
|
|
||||||
FORCEINLINE void Grab(const USGVirtualHandComponent* Hand, AActor* Actor)
|
|
||||||
{
|
{
|
||||||
return Hand == HandLeft ? GrabLeft(Actor) : GrabRight(Actor);
|
Grab(HandLeft, Actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORCEINLINE void GrabRight(AActor* Actor)
|
||||||
|
{
|
||||||
|
Grab(HandRight, Actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Grab(USGVirtualHandComponent* Hand, AActor* Actor);
|
||||||
|
|
||||||
void ReleaseLeft();
|
void ReleaseLeft();
|
||||||
|
|
||||||
void ReleaseRight();
|
void ReleaseRight();
|
||||||
|
|||||||
Reference in New Issue
Block a user