Créer un FPS #1 – First Person Controller / 1ère personne – Tuto Unity débutant

Dans ce tutoriel pour Unity (en français !), nous allons d’abord apprendre à créer un simple First Person Controller. C’est effectivement la base pour tout jeu FPS. Ainsi, le joueur pourra se déplacer dans une scène en 3D. Il sera capable de marcher, courir, sauter, monter et descendre une pente, il pourra également regarder autour de lui, comme s’il tournait la tête.

  1. Pour commencer, créer un nouveau projet 3D.
  2. Créez un 3D Object de type Terrain.
    Position : x=-250 ; y=0 ; z=-250
  3. Ensuite, Créez un 3D Object de type Capsule.
  4. Renommez le en « Player ».
    Position : x=0 ; y=3 ; z=0
  5. Puis, déplacez Main Camera dans Player.
    Configurez la position de la caméra ainsi : x = 0 ; y = 1.8; z = 0
  6. Sur Player : ajoutez le composant Character Controller.
  7. Enfin, ajoutez le script ci-dessous.

Le script : PlayerFPS

Le script PlayerFPS permet à votre personnage de faire les mouvements de base, de plus, la gravité est simulée afin que le joueur retombe toujours au sol, lorsqu’il effectue un saut par exemple.

(N’oubliez pas d’assigner Main Camera à playerCamera)

using UnityEngine;

public class PlayerFPS : MonoBehaviour
{
    //Camera
    public Camera playerCamera;

    //Composant qui permet de faire bouger le joueur
    CharacterController characterController;

    //Vitesse de marche
    public float walkingSpeed = 7.5f;

    //Vitesse de course
    public float runningSpeed = 15f;

    //Vitesse de saut
    public float jumpSpeed = 8f;

    //Gravité
    float gravity = 20f;

    //Déplacement
    Vector3 moveDirection;

    //Marche ou court ?
    private bool isRunning = false;

    //Rotation de la caméra
    float rotationX = 0;
    public float rotationSpeed = 2.0f;
    public float rotationXLimit = 45.0f;
    

    // Start is called before the first frame update
    void Start()
    {
        //Cache le curseur de la souris
        Cursor.visible = false;
        characterController = GetComponent<CharacterController>();  
    }

    // Update is called once per frame
    void Update()
    {
        //Calcule les directions
        //forward = avant/arrière
        //right = droite/gauche
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);

        //Est-ce qu'on appuie sur un bouton de direction ?

        // Z = axe arrière/avant
        float speedZ = Input.GetAxis("Vertical");

        // X = axe gauche/droite
        float speedX = Input.GetAxis("Horizontal");

        // Y = axe haut/bas
        float speedY = moveDirection.y;


        //Est-ce qu'on appuie sur le bouton pour courir (ici : Shift Gauche) ?
        if (Input.GetKey(KeyCode.LeftShift))
        {
            //En train de courir
            isRunning = true;
        }
        else
        {
            //En train de marcher
            isRunning = false;
        }

        // Est-ce que l'on court ?
        if (isRunning)
        {
            //Multiplie la vitesse par la vitesse de course
            speedX = speedX * runningSpeed;
            speedZ = speedZ * runningSpeed;
        }
        else
        {
            //Multiplie la vitesse par la vitesse de marche
            speedX = speedX * walkingSpeed;
            speedZ = speedZ * walkingSpeed;
        }

        

        //Calcul du mouvement
        //forward = axe arrière/avant
        //right = axe gauche/droite
        moveDirection = forward * speedZ + right * speedX;

       
        // Est-ce qu'on appuie sur le bouton de saut (ici : Espace)
        if (Input.GetButton("Jump") && characterController.isGrounded)
        {

            moveDirection.y = jumpSpeed;
        }
      else
        {
            moveDirection.y = speedY;
        }


        //Si le joueur ne touche pas le sol
        if (!characterController.isGrounded)
        {
            //Applique la gravité * deltaTime
            //Time.deltaTime = Temps écoulé depuis la dernière frame
            moveDirection.y -= gravity * Time.deltaTime;
        }


        //Applique le mouvement
        characterController.Move(moveDirection * Time.deltaTime);



        //Rotation de la caméra

        //Input.GetAxis("Mouse Y") = mouvement de la souris haut/bas
        //On est en 3D donc applique ("Mouse Y") sur l'axe de rotation X 
        rotationX += -Input.GetAxis("Mouse Y") * rotationSpeed;

        //La rotation haut/bas de la caméra est comprise entre -45 et 45 
        //Mathf.Clamp permet de limiter une valeur
        //On limite rotationX, entre -rotationXLimit et rotationXLimit (-45 et 45)
        rotationX = Mathf.Clamp(rotationX, -rotationXLimit, rotationXLimit);


        //Applique la rotation haut/bas sur la caméra
        playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);


        //Input.GetAxis("Mouse X") = mouvement de la souris gauche/droite
        //Applique la rotation gauche/droite sur le Player
        transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * rotationSpeed, 0);
    }
}

Les commandes

Pour contrôler le joueur, il faut utiliser les touches du clavier :

  • Pour avancer et reculer = flèches haut/bas
  • Effectuer les déplacements latéraux à gauche et à droite = Flèche de gauche/droite
  • Sauter = espace
  • Pour courir, maintenez Shift

Ensuite, la souris permet au joueur de regarder autour de lui, (haut/bas) et de changer de direction (droite/gauche).

Comme vous l’avez sans doute remarqué, le joueur ne peut pas encore tirer, c’est en effet, le sujet d’un autre tutoriel : Créer un FPS. Partie 2. Ajoutons le gun !

Unity Site officiel : https://unity.com/fr

Recevez les dernières actus

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

14 réflexions sur “Créer un FPS #1 – First Person Controller / 1ère personne – Tuto Unity débutant”

  1. Bonjour le script fonctionne la capsule se deplace bien mais la vu elle ne bouge pas quand je deplace la souris. J’ai deja regarder le script il est aux complet et je ne comprent pas pourquoi sa ne fonctionne pas merci.

  2. Bonjour merci pour le tuto qui fonctionne bien seulement comment faire car le pointeur de la souris reste toujours là et quand je met ma pause menu la rotation de la caméra continue, merci pour toutes réponse.

  3. Bonjour,

    Script parfaitement fonctionnel.
    Un grand merci à vous.
    Juste une suggestion, est il possible de faire glisser le personnage sur une pente ? J’ai une plateforme qui tourne et, quand le joueur est dessus, il reste statique jusqu’à ce qu’elle soit à 90 degrés, ou la il tombe.
    <merci d'avance

  4. c trop bizarre quand je copie colle le script non seulement il ne marche Mais en plus tout les e accent (é) sont entour en jaune et un message me met quand je clique dessus the caractère U00+e9 (é) n est un jsp quoi de language of ascii
    bref du coup j’ai chnage tout les é en U00+e9pour voir et toujours rien voila je suis bien emebter si tu aurais une solution ce serait cool

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut