refactor physics handle code

This commit is contained in:
Tyrel Souza 2018-02-22 21:53:14 -05:00
parent d7a96d278d
commit b7be0494d7
2 changed files with 31 additions and 52 deletions

View File

@ -5,6 +5,7 @@
#include "GameFramework/Actor.h"
#include "PhysicsEngine/PhysicsHandleComponent.h"
#include "Components/InputComponent.h"
#include "Components/PrimitiveComponent.h"
#include "Public/DrawDebugHelpers.h"
#define OUT
@ -31,31 +32,14 @@ void UGrabber::BeginPlay() {
void UGrabber::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
SetPlayerLookingAt();
// if physics handle is attached
// move object holding
// do nothing
/// Get player View point in this tick
FVector PlayerViewpointLocation;
FRotator PlayerViewpointRotation;
GetWorld()->GetFirstPlayerController(
)->GetPlayerViewPoint(
OUT PlayerViewpointLocation,
OUT PlayerViewpointRotation
);
FVector LineTraceEnd = PlayerViewpointLocation + PlayerViewpointRotation.Vector() * Reach;
/// if physics handle is attached move object holding
if (PhysicsHandle->GrabbedComponent) {
PhysicsHandle->SetTargetLocation(LineTraceEnd);
PhysicsHandle->SetTargetLocation(GetReachLineEnd());
}
}
// Raycast and grab what is in reach
void UGrabber::Grab() {
UE_LOG(LogTemp, Warning, TEXT("GRABBING!"));
@ -65,16 +49,10 @@ void UGrabber::Grab() {
auto ActorHit = HitResult.GetActor();
// if we hit something attach physics handle
// TODO: attach physics handle
if (ActorHit) {
PhysicsHandle->GrabComponent(
ComponentToGrab,
NAME_None,
ComponentToGrab->GetOwner()->GetActorLocation(),
true //allow rotation
);
PhysicsHandle->GrabComponent(ComponentToGrab, NAME_None,
ComponentToGrab->GetOwner()->GetActorLocation(), true);
}
}
// Release
@ -88,9 +66,7 @@ void UGrabber::Release() {
// Look for attached physics handle
void UGrabber::FindPhysicsHandleComponent() {
PhysicsHandle = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
if (PhysicsHandle) {
} else {
if (PhysicsHandle == nullptr) {
UE_LOG(LogTemp, Error, TEXT("%s has no PhysicsHandle"), *(GetOwner()->GetName()));
}
}
@ -100,10 +76,8 @@ void UGrabber::SetUpInputComponent() {
InputComponent = GetOwner()->FindComponentByClass<UInputComponent>();
if (InputComponent) {
UE_LOG(LogTemp, Warning, TEXT("%s has a InputHandle"), *(GetOwner()->GetName()));
InputComponent->BindAction("Grab", IE_Pressed, this, &UGrabber::Grab);
InputComponent->BindAction("Grab", IE_Released, this, &UGrabber::Release);
} else {
UE_LOG(LogTemp, Error, TEXT("%s has no InputHandle"), *(GetOwner()->GetName()));
}
@ -111,27 +85,14 @@ void UGrabber::SetUpInputComponent() {
FHitResult UGrabber::GetFirstPhysicsBodyInReach() const
{
/// Get player View point in this tick
FVector PlayerViewpointLocation;
FRotator PlayerViewpointRotation;
GetWorld()->GetFirstPlayerController(
)->GetPlayerViewPoint(
OUT PlayerViewpointLocation,
OUT PlayerViewpointRotation
);
FVector LineTraceEnd = PlayerViewpointLocation + PlayerViewpointRotation.Vector() * Reach;
///Setup Query Parameters
FCollisionQueryParams TraceParameters(FName(TEXT("")), false, GetOwner());
/// Line-Trace (Ray-Cast) out to reach distance
FHitResult Hit;
FCollisionQueryParams TraceParameters(FName(TEXT("")), false, GetOwner());
GetWorld()->LineTraceSingleByObjectType(
OUT Hit,
PlayerViewpointLocation,
LineTraceEnd,
GetReachLineStart(),
GetReachLineEnd(),
FCollisionObjectQueryParams(ECollisionChannel::ECC_PhysicsBody),
TraceParameters
);
@ -144,7 +105,18 @@ FHitResult UGrabber::GetFirstPhysicsBodyInReach() const
return Hit;
}
FVector UGrabber::GetReachLineEnd() const {
return PlayerViewpointLocation + PlayerViewpointRotation.Vector() * Reach;
}
//DrawDebugLine(GetWorld(), PlayerViewpointLocation, LineTraceEnd, FColor(255, 0, 0), false,
// 0.f, 0, 5.0f
//);
FVector UGrabber::GetReachLineStart() const {
return PlayerViewpointLocation;
}
void UGrabber::SetPlayerLookingAt() {
GetWorld()->GetFirstPlayerController(
)->GetPlayerViewPoint(
OUT PlayerViewpointLocation,
OUT PlayerViewpointRotation
);
}

View File

@ -38,4 +38,11 @@ private:
// Return hit for first physics body in reach
FHitResult GetFirstPhysicsBodyInReach() const;
FVector PlayerViewpointLocation;
FRotator PlayerViewpointRotation;
FVector GetReachLineEnd() const;
FVector GetReachLineStart() const;
void SetPlayerLookingAt();
};