Unity FPS Controller

FPS (or First-Person Shooter) is a game where the main character is controlled from a first-person perspective.

The usual controls are W, A, S, and D to walk, Mouse Look to look around, Space to jump, and Left Shift to sprint, allowing the player to move freely around the level.

In this post, I will show how to make an FPS controller in Unity that will handle camera rotation and player movement.


To make an FPS controller, follow the steps below:

  • Create a new Game Object (GameObject -> Create Empty) and name it "FPSPlayer"
  • Create a new Capsule (GameObject -> 3D Object -> Capsule) and move it inside the "FPSPlayer" Object
  • Remove the Capsule Collider component from Capsule and change its position to (0, 1, 0)
  • Move the Main Camera inside the "FPSPlayer" Object and change its position to (0, 1.64, 0)

  • Create a new script, name it "SC_FPSController" and paste the code below inside it:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class SC_FPSController : MonoBehaviour
    public float walkingSpeed = 7.5f;
    public float runningSpeed = 11.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Camera playerCamera;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    CharacterController characterController;
    Vector3 moveDirection = Vector3.zero;
    float rotationX = 0;

    public bool canMove = true;

    void Start()
        characterController = GetComponent<CharacterController>();

        // Lock cursor
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;

    void Update()
        // We are grounded, so recalculate move direction based on axes
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);
        // Press Left Shift to run
        bool isRunning = Input.GetKey(KeyCode.LeftShift);
        float curSpeedX = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Vertical") : 0;
        float curSpeedY = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Horizontal") : 0;
        float movementDirectionY = moveDirection.y;
        moveDirection = (forward * curSpeedX) + (right * curSpeedY);

        if (Input.GetButton("Jump") && canMove && characterController.isGrounded)
            moveDirection.y = jumpSpeed;
            moveDirection.y = movementDirectionY;

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        if (!characterController.isGrounded)
            moveDirection.y -= gravity * Time.deltaTime;

        // Move the controller
        characterController.Move(moveDirection * Time.deltaTime);

        // Player and Camera rotation
        if (canMove)
            rotationX += -Input.GetAxis("Mouse Y") * lookSpeed;
            rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
            playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
            transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
  • Attach the SC_FPSController script to the "FPSPlayer" Object (You will notice that it also added another component called Character Controller, change its center value to (0, 1, 0))
  • Assign the Main Camera to the Player Camera variable in SC_FPSController

Unity FPS Controller

The FPS controller is now ready!

📁FPSController.unitypackage53.91 KB
Suggested Articles
Adding Crouching to FPS Player in Unity
Player 3D and 2D Wall Jump Tutorial for Unity
Character Controller How to Add Ability to Push Rigidbodies in Unity
Unity How to Make Mobile Touch Controls
Creating Player Movement in Unity
How to Add Moving Platform Support to the Character Controller in Unity
Rigidbody-based Planetary Player Controller for Unity