- Home /
My Rigidbody FPS controller is falling very slow, please help!
My movement script:
How it looks for me: [Youtube][1] BTW, my gravity is set to -19,62.
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class PlayerMovement : MonoBehaviour { float playerHeight = 2f;
[SerializeField] Transform orientation;
[Header("Movement")]
[SerializeField] float moveSpeed = 6f;
[SerializeField] float airMultiplier = 0.4f;
float movementMultiplier = 10f;
[Header("Sprinting")]
[SerializeField] float walkSpeed = 8f;
[SerializeField] float sprintSpeed = 10f;
[SerializeField] float acceleration = 10f;
[Header("Jumping")]
public float jumpForce = 10f;
[Header("Keybinds")]
[SerializeField] KeyCode jumpKey = KeyCode.Space;
[SerializeField] KeyCode sprintKey = KeyCode.LeftShift;
[Header("Drag")]
[SerializeField] float groundDrag = 6f;
[SerializeField] float airDrag = 0f;
float horizontalMovement;
float verticalMovement;
[Header("Ground Detection")]
[SerializeField] Transform groundCheck;
[SerializeField] LayerMask groundMask;
[SerializeField] float groundDistance = 0.2f;
public bool isGrounded { get; private set; }
Vector3 moveDirection;
Vector3 slopeMoveDirection;
Rigidbody rb;
RaycastHit slopeHit;
private bool OnSlope()
{
if (Physics.Raycast(transform.position, Vector3.down, out slopeHit, playerHeight / 2 + 0.5f))
{
if (slopeHit.normal != Vector3.up)
{
return true;
}
else
{
return false;
}
}
return false;
}
private void Start()
{
rb = GetComponent<Rigidbody>();
rb.freezeRotation = true;
}
private void Update()
{
isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
MyInput();
ControlDrag();
ControlSpeed();
if (Input.GetKeyDown(jumpKey) && isGrounded)
{
Jump();
}
slopeMoveDirection = Vector3.ProjectOnPlane(moveDirection, slopeHit.normal);
}
void MyInput()
{
horizontalMovement = Input.GetAxisRaw("Horizontal");
verticalMovement = Input.GetAxisRaw("Vertical");
moveDirection = orientation.forward * verticalMovement + orientation.right * horizontalMovement;
}
void Jump()
{
if (isGrounded)
{
rb.velocity = new Vector3(rb.velocity.x, 0, rb.velocity.z);
rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
}
}
void ControlSpeed()
{
if (Input.GetKey(sprintKey) && isGrounded)
{
moveSpeed = Mathf.Lerp(moveSpeed, sprintSpeed, acceleration * Time.deltaTime);
}
else
{
moveSpeed = Mathf.Lerp(moveSpeed, walkSpeed, acceleration * Time.deltaTime);
}
}
void ControlDrag()
{
if (isGrounded)
{
rb.drag = groundDrag;
}
else
{
rb.drag = airDrag;
}
}
private void FixedUpdate()
{
MovePlayer();
}
void MovePlayer()
{
if (isGrounded && !OnSlope())
{
rb.AddForce(moveDirection.normalized * moveSpeed * movementMultiplier, ForceMode.Acceleration);
}
else if (isGrounded && OnSlope())
{
rb.AddForce(slopeMoveDirection.normalized * moveSpeed * movementMultiplier, ForceMode.Acceleration);
}
else if (!isGrounded)
{
rb.AddForce(moveDirection.normalized * moveSpeed * movementMultiplier * airMultiplier, ForceMode.Acceleration);
}
}
}
Answer by DenisIsDenis · Jul 17, 2021 at 02:10 PM
In the settings of your Rigidbody
, you set the Drag
equal to 2. In fact, this slows down the fall. Set it to zero and the drop will be faster.
It did work but now if I jump and hold down "W" i fly forward.
@MMKnight, I tested your script and found out the reason. You limited the player's speed through drag
, but when you made a drag
equal to 0 in the air, nothing prevented the player's infinite acceleration, he could move at any speed.
I suggest limiting the player's movement speed manually, just change your FixedUpdate()
to the following lines:
private void FixedUpdate ()
{
MovePlayer ();
float maxSpeed = 7; // Maximum speed (better to make it global)
Vector3 velocity = rb.velocity; // Create a velocity vector with which we will work
velocity.y = 0; // Zero the y-axis because we want to keep the falling speed.
velocity = Vector3.ClampMagnitude(velocity, maxSpeed); // Limiting the speed of movement
velocity.y = rb.velocity.y; // Returning the y-axis value
rb.velocity = velocity; // And change the velocity of Rigidbody
}
(Note: if the player's movement occurs with a little twitching, then enable motion interpolation in the settings of your Rigidbody
).
Answer by b1gry4n · Jul 17, 2021 at 02:07 PM
you are setting your air drag to 2f, thats pretty high. try 0.01f and go up from there
It did work but now if I jump and hold down "W" i fly forward.