- 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.
Your answer