Hi guys, I try to create a character which is follows the camera direction, but you can pan around it when you stop moving.
When i try to move left/right the player still moving forward/backward, and the player stops following the camera direction if you turn to fast,pass a certain point or sometimes not even working.
If I hold down the aim button everything just works fine, i can move every direction and the character keeps following the camera. I can't figure it out, maybe you guys can help me.
Thanks
The code
.h
.cpp
When i try to move left/right the player still moving forward/backward, and the player stops following the camera direction if you turn to fast,pass a certain point or sometimes not even working.
If I hold down the aim button everything just works fine, i can move every direction and the character keeps following the camera. I can't figure it out, maybe you guys can help me.
Thanks
The code
.h
Code:
public: /** Lean and others */ float LeanAngleInterp; void ProceduralLeaning(); void CycleMovement(); FVector CalculateWorldDirection();
Code:
ASCharacter::ASCharacter(const class FObjectInitializer& ObjectInitializer) /* Override the movement class from the base class to our own to support multiple speeds (eg. sprinting) */ : Super(ObjectInitializer.SetDefaultSubobjectClass<USCharacterMovementComponent>(ACharacter::CharacterMovementComponentName)) { /... UCharacterMovementComponent* MoveComp = GetCharacterMovement(); // Adjust jump to make it less floaty MoveComp->JumpZVelocity = 800; MoveComp->AirControl = 0.7f; MoveComp->GravityScale = 2.0f; MoveComp->MaxAcceleration = 1500.0f; MoveComp->BrakingFrictionFactor = 0.0f; MoveComp->MaxWalkSpeedCrouched = 200; MoveComp->bCanWalkOffLedgesWhenCrouching = true; MoveComp->RotationRate = FRotator(0, 0, 340.0f); MoveComp->bOrientRotationToMovement = true; // For the camera rotation bUseControllerRotationYaw = false; /... } /... void ASCharacter::SetTargeting(bool NewTargeting) { bIsTargeting = NewTargeting; bUseControllerRotationYaw = NewTargeting; if (Role < ROLE_Authority) { ServerSetTargeting(NewTargeting); } } /... void ASCharacter::Tick(float DeltaTime) { Super::Tick(DeltaTime); CycleMovement(); } /... void ASCharacter::MoveForward(float Val) { if (Controller && Val != 0.f) { /* const FRotator Rotation = Controller->GetControlRotation(); const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::X); */ if (IsTargeting()) { const FVector Forward = GetActorForwardVector(); AddMovementInput(Forward, Val); } else { const FVector Direction = CalculateWorldDirection(); AddMovementInput(Direction, Val); } } } void ASCharacter::MoveRight(float Val) { if (Val != 0.f) { /* const FRotator Rotation = GetActorRotation(); const FVector Direction = FRotationMatrix(Rotation).GetScaledAxis(EAxis::Y); */ if (IsTargeting()) { const FVector Right = GetActorRightVector(); AddMovementInput(Right, Val); } else { const FVector Direction = CalculateWorldDirection(); AddMovementInput(Direction, Val); } } } /... void ASCharacter::CycleMovement() { FVector ControlVector = GetControlRotation().Vector(); FVector Projected = FVector::VectorPlaneProject(ControlVector, GetActorUpVector()).GetSafeNormal(); FRotator NormalRot = Projected.Rotation(); FVector Forward = NormalRot.Vector() * GetInputAxisValue(FName("MoveForward")); FVector Right = UKismetMathLibrary::GetRightVector(NormalRot) * GetInputAxisValue(FName("MoveRight")); NormalDirection = (Forward + Right).GetSafeNormal(); } FVector ASCharacter::CalculateWorldDirection() { UCharacterMovementComponent* MoveComp = GetCharacterMovement(); float CharRotation = MoveComp->RotationRate.Yaw * GetWorld()->DeltaTimeSeconds; float DotNormal = FVector::DotProduct(GetActorForwardVector(), NormalDirection); float NormalDegree = UKismetMathLibrary::DegAcos(DotNormal); float b2 = CharRotation / NormalDegree; int clamped = UKismetMathLibrary::FClamp(b2, -1.0, 1.0); FRotator RotFromX = NormalDirection.Rotation(); FRotator FinalRotation = UKismetMathLibrary::RLerp(GetActorRotation(), RotFromX, clamped, true); return FinalRotation.Vector(); }
Comment