Player Movement in unity3d


I have been working on a first person 3d player movement system on a off for 3ish months now. I still feel relatively unsatisfied with my result. Currently, I am using rb.velocity and setting it to a movement vector. I have implemented friction to stop the player, per-axis acceleration, and tanh curve acceleration. Still the result I’m getting feels “cheap” and unsatisfying. I might be doing this the entirely wrong way but I chose rigidbody movement because of its freedom.

I know I’m asking a lot, but please please help and if you need it here is my very messy coed at its current state:

Definitely use CharacterController. It is so beautiful, simple and customizable. I highly recommend you do some research and check it out. Here is a simple movement script I made in 5 minutes (And it is perfect):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FPController : MonoBehaviour
    public Camera camera;
    public float sensitivity;

    public bool invertY;

    public float moveSpeed;
    public float gravity;
    public float yMovement;
    public float jumpSpeed;

    public CharacterController cc;

    private float cameraRotation;
    private float playerRotation;

    void Start()
        Cursor.lockState = CursorLockMode.Locked;

    void Update()
    void HandleMovement()
        float forward = Input.GetAxisRaw("Vertical");
        float right = Input.GetAxisRaw("Horizontal");

        yMovement -= gravity * Time.deltaTime;

        bool isGrounded = cc.isGrounded;
        if(isGrounded) yMovement = 0;
        if(Input.GetKey(KeyCode.Space) && isGrounded)
            yMovement = jumpSpeed;

        Vector3 motion = new Vector3(0, yMovement, 0);
        motion += transform.forward * forward;
        motion += transform.right * right;

        motion *= moveSpeed * Time.deltaTime;


    void HandleRotation()
        float xMouse = Input.GetAxisRaw("Mouse X");
        float yMouse = Input.GetAxisRaw("Mouse Y");

        yMouse *= invertY ? -1: 1;

        cameraRotation += yMouse * sensitivity * Time.deltaTime;
        playerRotation += xMouse * sensitivity * Time.deltaTime;

        camera.transform.localEulerAngles = new Vector3(cameraRotation, 0, 0);
        transform.localEulerAngles = new Vector3(0, playerRotation, 0);