Skip to content
Snippets Groups Projects
Commit ca3dd2bf authored by Qurabi's avatar Qurabi
Browse files

Das Fallen und die Gravitation funktionieren jetzt.

Das Problem, dass man nach unten fällt, wenn Multi Line Traces verschiedene Actors getroffen haben, ist behoben.
Der Code ist hoffentlich gut aufgeraümt.
parent f3a825a9
No related branches found
No related tags found
No related merge requests found
......@@ -52,7 +52,6 @@ AVirtualRealityPawn::AVirtualRealityPawn(const FObjectInitializer& ObjectInitial
HmdRightMotionController->SetVisibility(false);
CapsuleColliderComponent = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleCollider"));
CapsuleColliderComponent->OnComponentHit.AddDynamic(this, &AVirtualRealityPawn::OnHit);
CapsuleColliderComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
CapsuleColliderComponent->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
CapsuleColliderComponent->SetCollisionResponseToChannel(ECollisionChannel::ECC_WorldStatic, ECollisionResponse::ECR_Block);
......@@ -173,15 +172,6 @@ void AVirtualRealityPawn::ClusterExecute(const FString& Command)
IDisplayCluster::Get().GetClusterMgr()->EmitClusterEvent(event, false);
}
void AVirtualRealityPawn::OnHit(UPrimitiveComponent * HitComponent, AActor * OtherActor, UPrimitiveComponent * OtherComponent, FVector NormalImpulse, const FHitResult & Hit)
{
// Other Actor is the actor that triggered the event. Check that is not ourself.
if ((OtherActor != nullptr) && (OtherActor != this) && (OtherComponent != nullptr))
{
}
}
void AVirtualRealityPawn::HandleClusterEvent(const FDisplayClusterClusterEvent& Event)
{
if (Event.Category.Equals("VRPawn") && Event.Type.Equals("NDisplayCMD") && Event.Parameters.Contains("Command"))
......@@ -190,20 +180,6 @@ void AVirtualRealityPawn::HandleClusterEvent(const FDisplayClusterClusterEvent&
}
}
void AVirtualRealityPawn::OnOverlapBegin(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
//if (OtherActor && (OtherActor != this) && OtherComp)
}
void AVirtualRealityPawn::OnOverlapEnd(UPrimitiveComponent * OverlappedComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int32 OtherBodyIndex)
{
//if (OtherActor && (OtherActor != this) && OtherComp)
//{
// HasContact = false;
}
void AVirtualRealityPawn::BeginPlay()
{
Super::BeginPlay();
......@@ -301,8 +277,6 @@ void AVirtualRealityPawn::Tick(float DeltaSeconds)
PhysWolkingMode();
}
//Flystick might not be available at start, hence is checked every frame.
InitRoomMountedComponentReferences();
......@@ -393,15 +367,38 @@ void AVirtualRealityPawn::VRClimbStepUp(float DeltaSeconds)
{
FVector StartLineTraceUnderCollider = CapsuleColliderComponent->GetComponentLocation();
StartLineTraceUnderCollider.Z -= CapsuleColliderComponent->GetScaledCapsuleHalfHeight();
FHitResult HitDetailsMultiLineTrace = CreateMultiLineTrace(FVector(0, 0, -1), StartLineTraceUnderCollider, CapsuleColliderComponent->GetScaledCapsuleRadius() / 2.0f, true);
FHitResult HitDetailsMultiLineTrace = CreateMultiLineTrace(FVector(0, 0, -1), StartLineTraceUnderCollider, CapsuleColliderComponent->GetScaledCapsuleRadius() / 2.0f, false);
float DiffernceDistance = abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance);
static float SumUpSteppingSpeed = 0.0f;
if (HitDetailsMultiLineTrace.bBlockingHit && (HitDetailsMultiLineTrace.Distance < MaxStepHeight) && HitDetailsMultiLineTrace.Actor != RootComponent->GetAttachmentRootActor() && HitDetailsMultiLineTrace.Location != HitDetailsMultiLineTrace.TraceStart)
if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance < MaxStepHeight))
{
RootComponent->AddLocalOffset(FVector(0, 0, +abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance)));
SumUpSteppingSpeed += UpSteppingSpeed * DeltaSeconds;
if (SumUpSteppingSpeed*DeltaSeconds < DiffernceDistance)
{
RootComponent->AddLocalOffset(FVector(0.f, 0.f, +SumUpSteppingSpeed * DeltaSeconds));
}
else
{
RootComponent->AddLocalOffset(FVector(0.f, 0.f, +DiffernceDistance));
}
}
else if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance > MaxStepHeight) || HitDetailsMultiLineTrace.Actor == nullptr && HitDetailsMultiLineTrace.Distance != -1.0f)
{
GravitySpeed -= 1000.0f*DeltaSeconds;
if (GravitySpeed*DeltaSeconds > -DiffernceDistance)
{
RootComponent->AddLocalOffset(FVector(0.f, 0.f, GravitySpeed*DeltaSeconds));
}
else if ((HitDetailsMultiLineTrace.Distance > MaxStepHeight))
else
{
RootComponent->AddLocalOffset(FVector(0.f, 0.f, -DiffernceDistance));
}
}
else
{
RootComponent->AddLocalOffset(FVector(0, 0, -abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance)));
GravitySpeed = 0.0f;
SumUpSteppingSpeed = 0.0f;
}
}
......@@ -464,22 +461,25 @@ FHitResult AVirtualRealityPawn::CreateLineTrace(FVector Direction, const FVector
return HitDetails;
}
FHitResult AVirtualRealityPawn::CreateMultiLineTrace(FVector Direction, const FVector Start, float distance, bool Visibility) {
FHitResult AVirtualRealityPawn::CreateMultiLineTrace(FVector Direction, const FVector Start, float distance, bool Visibility)
{
FHitResult HitDetailsMultiLineTrace;
HitDetailsMultiLineTrace.Distance = -1.0f;//-1 not exist, but to know if this Objekt not Initialized(when all Traces not compatible)
FHitResult HitDetailsFromLineTraceCenter = CreateLineTrace(Direction, Start, Visibility);
FHitResult HitDetailsFromLineTraceLeft = CreateLineTrace(Direction, Start + FVector(0, -distance, 0), Visibility);
FHitResult HitDetailsFromLineTraceRight = CreateLineTrace(Direction, Start + FVector(0, distance, 0), Visibility);
FHitResult HitDetailsFromLineTraceFront = CreateLineTrace(Direction, Start + FVector(distance, 0, 0), Visibility);
FHitResult HitDetailsFromLineTraceBehind = CreateLineTrace(Direction, Start + FVector(-distance, 0, 0), Visibility);
bool bBlockingHitAndSameActor = (HitDetailsFromLineTraceCenter.bBlockingHit && HitDetailsFromLineTraceLeft.bBlockingHit
&& HitDetailsFromLineTraceRight.bBlockingHit && HitDetailsFromLineTraceFront.bBlockingHit
&& HitDetailsFromLineTraceBehind.bBlockingHit)
&& (HitDetailsFromLineTraceCenter.Actor == HitDetailsFromLineTraceLeft.Actor
&& HitDetailsFromLineTraceLeft.Actor == HitDetailsFromLineTraceRight.Actor
&& HitDetailsFromLineTraceRight.Actor == HitDetailsFromLineTraceFront.Actor
&& HitDetailsFromLineTraceFront.Actor == HitDetailsFromLineTraceBehind.Actor);
if (bBlockingHitAndSameActor)
bool BlockingHitAndSameActor = (HitDetailsFromLineTraceCenter.bBlockingHit)
&& (HitDetailsFromLineTraceCenter.Actor == HitDetailsFromLineTraceLeft.Actor&& HitDetailsFromLineTraceLeft.Actor == HitDetailsFromLineTraceRight.Actor
&& HitDetailsFromLineTraceRight.Actor == HitDetailsFromLineTraceFront.Actor&& HitDetailsFromLineTraceFront.Actor == HitDetailsFromLineTraceBehind.Actor);
//If you are falling
bool AllNothingHiting = HitDetailsFromLineTraceCenter.Actor == nullptr && HitDetailsFromLineTraceLeft.Actor == nullptr
&& HitDetailsFromLineTraceRight.Actor == nullptr && HitDetailsFromLineTraceFront.Actor == nullptr;
if (BlockingHitAndSameActor || AllNothingHiting)
HitDetailsMultiLineTrace = HitDetailsFromLineTraceCenter;
return HitDetailsMultiLineTrace;
......
......@@ -68,15 +68,9 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pawn") float MaxStepHeight = 40.f;
//Execute specified console command on all nDisplayCluster Nodes
UFUNCTION(Exec, BlueprintCallable, Category = "DisplayCluster") static void ClusterExecute(const FString& Command);
UFUNCTION() void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit);
private:
FOnClusterEventListener ClusterEventListenerDelegate;
UFUNCTION() void HandleClusterEvent(const FDisplayClusterClusterEvent& Event);
// declare overlap begin function
UFUNCTION(Category = "Pawn") void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
// declare overlap end function
UFUNCTION(Category = "Pawn") void OnOverlapEnd(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
protected:
DECLARE_DELEGATE_OneParam(FFireDelegate, bool);
DECLARE_DELEGATE_TwoParams(FActionDelegate, bool, int32);
......@@ -126,7 +120,7 @@ protected:
private:
float DeltaTime = 0.0f;
float GravitySpeed = 0.0f;
UPROPERTY() float UpSteppingSpeed = 100.0f;
UPROPERTY() float UpSteppingSpeed = 110.0f;
FVector LastCameraPosition;
FHitResult CreateLineTrace(FVector Direction, const FVector Start, bool Visibility);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment