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

Erdbeschleunigung ist jetzt drin.

Eine überflüssige Methode gelöscht.
Variablen umbenannt.
Den Code der Methode CreateMultiLineTrace verbessert.
parent 11c13dac
No related branches found
No related tags found
No related merge requests found
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include "Engine/Engine.h" #include "Engine/Engine.h"
#include "Camera/CameraComponent.h" #include "Camera/CameraComponent.h"
#include "Components/SphereComponent.h" #include "Components/SphereComponent.h"
#include "DrawDebugHelpers.h" // include draw debug helpers header file #include "DrawDebugHelpers.h"
#include "Math/Vector.h" #include "Math/Vector.h"
#include "VirtualRealityUtilities.h" #include "VirtualRealityUtilities.h"
...@@ -467,30 +467,19 @@ void AVirtualRealityPawn::VRWalkingMode(float Value, FVector Direction) ...@@ -467,30 +467,19 @@ void AVirtualRealityPawn::VRWalkingMode(float Value, FVector Direction)
} }
} }
bool AVirtualRealityPawn::IsColliderOnGround()
{
float CharachterSize = abs(RootComponent->GetComponentLocation().Z - CameraComponent->GetComponentLocation().Z);
if (CharachterSize > MaxStepHeight)
{
return true;
}
return false;
}
void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds) void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds)
{ {
FVector StartLineTraceUnderCollider = CapsuleColliderComponent->GetComponentLocation(); FVector StartLineTraceUnderCollider = CapsuleColliderComponent->GetComponentLocation();
StartLineTraceUnderCollider.Z -= CapsuleColliderComponent->GetScaledCapsuleHalfHeight(); StartLineTraceUnderCollider.Z -= CapsuleColliderComponent->GetScaledCapsuleHalfHeight();
FHitResult HitDetailsMultiLineTrace = CreateMultiLineTrace(FVector(0, 0, -1), StartLineTraceUnderCollider, CapsuleColliderComponent->GetScaledCapsuleRadius() / 2.0f, false); FHitResult HitDetailsMultiLineTrace = CreateMultiLineTrace(FVector(0, 0, -1), StartLineTraceUnderCollider, CapsuleColliderComponent->GetScaledCapsuleRadius() / 2.0f, false);
float DiffernceDistance = abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance); float DiffernceDistance = abs(MaxStepHeight - HitDetailsMultiLineTrace.Distance);
static float UpSteppingAcceleration = 0.0f;
//Going up //Going up
if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance < MaxStepHeight)) if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance < MaxStepHeight))
{ {
UpSteppingAcceleration += UpSteppingSpeed * DeltaSeconds; UpSteppingSpeed += UpSteppingAcceleration * DeltaSeconds;
if (UpSteppingAcceleration*DeltaSeconds < DiffernceDistance) if (UpSteppingSpeed*DeltaSeconds < DiffernceDistance)
{ {
RootComponent->AddLocalOffset(FVector(0.f, 0.f, +UpSteppingAcceleration * DeltaSeconds)); RootComponent->AddLocalOffset(FVector(0.f, 0.f, +UpSteppingSpeed * DeltaSeconds));
} }
else else
{ {
...@@ -500,10 +489,10 @@ void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds) ...@@ -500,10 +489,10 @@ void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds)
//Falling, Gravity, Going down //Falling, Gravity, Going down
else if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance > MaxStepHeight) || HitDetailsMultiLineTrace.Actor == nullptr && HitDetailsMultiLineTrace.Distance != -1.0f) else if ((HitDetailsMultiLineTrace.bBlockingHit && HitDetailsMultiLineTrace.Distance > MaxStepHeight) || HitDetailsMultiLineTrace.Actor == nullptr && HitDetailsMultiLineTrace.Distance != -1.0f)
{ {
GravityAcceleration -= 981.0f*DeltaSeconds; GravitySpeed -= GravityAcceleration *DeltaSeconds;
if (GravityAcceleration*DeltaSeconds > -DiffernceDistance) if (GravitySpeed*DeltaSeconds > -DiffernceDistance)
{ {
RootComponent->AddLocalOffset(FVector(0.f, 0.f, GravityAcceleration*DeltaSeconds)); RootComponent->AddLocalOffset(FVector(0.f, 0.f, GravitySpeed*DeltaSeconds));
} }
else else
{ {
...@@ -513,8 +502,8 @@ void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds) ...@@ -513,8 +502,8 @@ void AVirtualRealityPawn::MoveByGravityOrStepUp(float DeltaSeconds)
//Going on the ground //Going on the ground
else else
{ {
GravityAcceleration = 0.0f; GravitySpeed = 0.0f;
UpSteppingAcceleration = 0.0f; UpSteppingSpeed = 0.0f;
} }
} }
...@@ -579,24 +568,41 @@ FHitResult AVirtualRealityPawn::CreateLineTrace(FVector Direction, const FVector ...@@ -579,24 +568,41 @@ FHitResult AVirtualRealityPawn::CreateLineTrace(FVector Direction, const FVector
FHitResult AVirtualRealityPawn::CreateMultiLineTrace(FVector Direction, const FVector Start, float Radius, bool Visibility) FHitResult AVirtualRealityPawn::CreateMultiLineTrace(FVector Direction, const FVector Start, float Radius, bool Visibility)
{ {
TArray<FVector> Vectors;
TArray<FHitResult> OutHits;
FHitResult HitDetailsMultiLineTrace; FHitResult HitDetailsMultiLineTrace;
HitDetailsMultiLineTrace.Distance = -1.0f;//(Distance=-1) not existing, but to know if this Objekt not Initialized(when all Traces not compatible) HitDetailsMultiLineTrace.Distance = -1.0f;//(Distance=-1) not existing, but to know if this Variable not Initialized(when all Traces not compatible)
FHitResult HitDetailsFromLineTraceCenter = CreateLineTrace(Direction, Start, Visibility); Vectors.Add(Start); //LineTraceCenter
FHitResult HitDetailsFromLineTraceLeft = CreateLineTrace(Direction, Start + FVector(0, -Radius, 0), Visibility); Vectors.Add(Start + FVector(0, -Radius, 0)); //LineTraceLeft
FHitResult HitDetailsFromLineTraceRight = CreateLineTrace(Direction, Start + FVector(0, Radius, 0), Visibility); Vectors.Add(Start + FVector(0, +Radius, 0)); //LineTraceRight
FHitResult HitDetailsFromLineTraceFront = CreateLineTrace(Direction, Start + FVector(Radius, 0, 0), Visibility); Vectors.Add(Start + FVector(+Radius, 0, 0)); //LineTraceFront
FHitResult HitDetailsFromLineTraceBehind = CreateLineTrace(Direction, Start + FVector(-Radius, 0, 0), Visibility); Vectors.Add(Start + FVector(-Radius, 0, 0)); //LineTraceBehind
bool BlockingHitAndSameActor = (HitDetailsFromLineTraceCenter.bBlockingHit) // loop through TArray
&& (HitDetailsFromLineTraceCenter.Actor == HitDetailsFromLineTraceLeft.Actor&& HitDetailsFromLineTraceLeft.Actor == HitDetailsFromLineTraceRight.Actor for (FVector& Vector : Vectors)
&& HitDetailsFromLineTraceRight.Actor == HitDetailsFromLineTraceFront.Actor&& HitDetailsFromLineTraceFront.Actor == HitDetailsFromLineTraceBehind.Actor); {
//If you are falling OutHits.Add(CreateLineTrace(Direction, Vector, Visibility));
bool AllNothingHiting = HitDetailsFromLineTraceCenter.Actor == nullptr && HitDetailsFromLineTraceLeft.Actor == nullptr }
&& HitDetailsFromLineTraceRight.Actor == nullptr && HitDetailsFromLineTraceFront.Actor == nullptr;
FHitResult HitDetailsWithSmallestDistance = OutHits[0];
if (BlockingHitAndSameActor || AllNothingHiting) bool IsBlockingHitAndSameActor = HitDetailsWithSmallestDistance.bBlockingHit;
HitDetailsMultiLineTrace = HitDetailsFromLineTraceCenter; TWeakObjectPtr<class AActor> HitFirstActor = HitDetailsWithSmallestDistance.Actor;
for (FHitResult& Hit : OutHits)
{
IsBlockingHitAndSameActor &= (Hit.Actor != nullptr)&&(Hit.Actor == HitFirstActor);
if(IsBlockingHitAndSameActor)
{
if (Hit.Distance < HitDetailsWithSmallestDistance.Distance)
{
HitDetailsWithSmallestDistance = Hit;
}
}
}
if (IsBlockingHitAndSameActor)
HitDetailsMultiLineTrace = HitDetailsWithSmallestDistance;
return HitDetailsMultiLineTrace; return HitDetailsMultiLineTrace;
} }
...@@ -128,8 +128,10 @@ protected: ...@@ -128,8 +128,10 @@ protected:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UCapsuleComponent* CapsuleColliderComponent = nullptr; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pawn", meta = (AllowPrivateAccess = "true")) UCapsuleComponent* CapsuleColliderComponent = nullptr;
private: private:
float DeltaTime = 0.0f; float DeltaTime = 0.0f;
UPROPERTY() float GravityAcceleration = 0.0f; UPROPERTY() float GravityAcceleration = 981.0f;
UPROPERTY() float UpSteppingSpeed = 110.0f; float GravitySpeed = 0.0f;
UPROPERTY() float UpSteppingAcceleration = 110.0f;
float UpSteppingSpeed = 0.0f;
FVector LastCameraPosition; FVector LastCameraPosition;
FHitResult CreateLineTrace(FVector Direction, const FVector Start, bool Visibility); FHitResult CreateLineTrace(FVector Direction, const FVector Start, bool Visibility);
...@@ -138,6 +140,5 @@ private: ...@@ -138,6 +140,5 @@ private:
void CheckForPhysWalkingCollision(); void CheckForPhysWalkingCollision();
void VRWalkingMode(float Value, FVector Direction); void VRWalkingMode(float Value, FVector Direction);
void MoveByGravityOrStepUp(float DeltaSeconds); void MoveByGravityOrStepUp(float DeltaSeconds);
bool IsColliderOnGround();
void InitRoomMountedComponentReferences(); void InitRoomMountedComponentReferences();
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment