Controller (à coder soi-même)

Sur cette page tu apprendras coder ton propre controller.
L’avantage d’un controller que tu fais toi-même est que tu pourra l’améliorer librement et le changer selon les besoins de ton jeu.

Ce controller part du principe que tu à déjà un moyen de controller ta caméra (par script ou par Cinemachine)

Preparation

Avant tout commence par te créer un personnage que tu va controller. Il peut s’agir d’une simple capsule Unity, le plus important est d’y mettre un Collider (non trigger) et un Rigidbody.

Ensuite tu peux te referer au morceau du script qu’il te faut:

Le script

Pivoter avec la camera
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PersoBouge : MonoBehaviour
{
    public float vitesse;
    public float puissanceSaut;
    public int nombre_sauts;
    public float friction;
    int nb_saut;
    Vector3 direction;
    Rigidbody rb;
    bool auSol;
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; //verouille le curseur dans le jeu
        rb = GetComponent<Rigidbody>(); //récupère le rigidbody
    }
 
    void TourneAvecCamera() {
        //recupere la direction de la camera
        Vector3 targetForward = Camera.main.transform.forward;
        //retire les axes X et Z pour que le joueur tourne uniquement sur les coté
        targetForward.y = 0f;
        //applique sur le joueur
        transform.forward = targetForward.normalized;
    }
    void Update()
    {
        TourneAvecCamera();
    }
}

 

Recuperer les touches pressées par le joueur
void Update()

    {

      TourneAvecCamera();

 
//on recupère les input du joueur

        direction = transform.forward * Input.GetAxisRaw(« Vertical ») + transform.right * Input.GetAxisRaw(« Horizontal »);

        if (Input.GetButtonDown(« Jump »)) {

          //ici on va mettre plus tard la fonction du saut

      }

    }

}

Créer le mouvement
void Bouger() {
        if (auSol) {
            //au sol on avance que si on appuie les touches
            rb.AddForce(direction.normalized * vitesse * 10f, ForceMode.Force);
      }else {
            //dans les air, on garde notre élan
            rb.AddForce(direction.normalized * vitesse, ForceMode.Force);
        }
    }

 

    void Sauter() {
            if (nb_saut > 0) {
            //on reset la vitesse vertical (pour empecher la vitesse de chute d’influencer la puissance d’un saut)
                rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
            //on ajoute la puissance de saut
                rb.AddForce(transform.up * puissanceSaut, ForceMode.Impulse);
            //on décompte le multi-saut
                nb_saut -= 1;
            }
    }
}
Verification de sol
private void OnCollisionEnter(Collision collision) {
        if (collision.transform.tag == « sol ») {
            auSol = true;
            nb_saut = nombre_sauts;
        }
    }
    private void OnCollisionExit(Collision collision) {
        if (collision.transform.tag == « sol ») {
            auSol = false;
        }
  }
Appliquer les mouvements

On appliques les fonctions de mouvements dans le Update normal ou dans un Update spécial qui gère mieux la physique:

private void FixedUpdate() {
        Bouger();
    }
 
void Update()
    {
        TourneAvecCamera();
        //on recupère les input du joueur
        direction = transform.forward * Input.GetAxisRaw(« Vertical ») + transform.right * Input.GetAxisRaw(« Horizontal »);
 
        if (Input.GetButtonDown(« Jump »)) {
            Sauter();
        }
        //on utilise un physics material de type « ice » pour eviter d’accrocher au murs, il faut remettre un peu de friction pour le sol en consequence
        //sinon notre personnage patine comme sur de la glace
        if (auSol) {
            rb.drag = friction;
        }
        else {
            rb.drag = 0f;
        }
}
Script final

NE PAS OUBLIER DE TAGGER SES SOLS EN TANT QUE « sol »

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PersoBouge : MonoBehaviour
{
    public float vitesse;
    public float puissanceSaut;
    public int nombre_sauts;
    public float friction;
    public Animator mon_animator;
    int nb_saut;
    Vector3 direction;
    Rigidbody rb;
    bool auSol;
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; //verouille le curseur dans le jeu
        rb = GetComponent<Rigidbody>();
    }
    void TourneAvecCamera() {
        //recupere la direction de la camera
        Vector3 targetForward = Camera.main.transform.forward;
        //retire les axes X et Z pour que le joueur tourne uniquement sur les coté
        targetForward.y = 0f;
        //applique sur le joueur
        transform.forward = targetForward.normalized;
    }
    void Update()
    {
        TourneAvecCamera();
        //on recupère les input du joueur
        direction = transform.forward * Input.GetAxisRaw(« Vertical ») + transform.right * Input.GetAxisRaw(« Horizontal »);
        if (Input.GetButtonDown(« Jump »)) {
            Sauter();
        }
        //on utilise un physics material de type « ice » pour eviter d’accrocher au murs, il faut remettre un peu de friction pour le sol en consequence
        //sinon notre personnage patine comme sur de la glace
        if (auSol) {
            rb.drag = friction;
        }
        else {
            rb.drag = 0f;
        }
        //on anime la marche
        mon_animator.SetFloat(« vitesse », rb.velocity.magnitude);
mon_animator.SetBool(« air », !auSol);
    }
    private void FixedUpdate() {
        Bouger();
    }
    void Bouger() {
        if (auSol) {
            //au sol on avance que si on appuie les touches
            rb.AddForce(direction.normalized * vitesse * 10f, ForceMode.Force);
        }
        else {
            //dans les air, on garde notre élan
            rb.AddForce(direction.normalized * vitesse, ForceMode.Force);
        }
    }
    void Sauter() {
            if (nb_saut > 0) {
            //on reset la vitesse vertical (pour empecher la vitesse de chute d’influencer la puissance d’un saut)
                rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
            //on ajoute la puissance de saut
                rb.AddForce(transform.up * puissanceSaut, ForceMode.Impulse);
            //on décompte le multi-saut
                nb_saut -= 1;
            //on anime le saut
            mon_animator.SetTrigger(« saut »);
            }
    }
    private void OnCollisionEnter(Collision collision) {
        if (collision.transform.tag == « sol ») {
            auSol = true;
            nb_saut = nombre_sauts;
        }
    }
    private void OnCollisionExit(Collision collision) {
        if (collision.transform.tag == « sol ») {
            auSol = false;
        }
    }
}
Retour en haut