Menu
CoddyTech

CharacterController.Move

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 38 sur 60.

Un CharacterController est le composant de Unity destiné à un personnage qui marche : une capsule qui ne se déplace que lorsque ton script appelle controller.Move(motion). motion correspond à la distance à parcourir pendant cette image ; c’est donc une vitesse multipliée par Time.deltaTime. Move fait glisser la capsule le long des murs au lieu de la faire passer à travers, lui permet de monter les pentes jusqu’à sa limite de pente (45 degrés) et de franchir les rebords jusqu’à son décalage de marche (0.3 unité). Ce n’est pas un Rigidbody : pas de forces, pas de gravité, pas de rebond, et rien ne le pousse. Il va exactement là où Move l’envoie, ce qui est nécessaire pour des commandes de jeu précises.

C’est à toi d’ajouter la gravité et de détecter le sol. isGrounded vaut true lorsque le dernier Move a touché quelque chose en dessous ; ainsi, un déplacement sans composante vers le bas ne détecte jamais le sol. Un Move inférieur à la distance minimale de déplacement du contrôleur (0.001) ne fait absolument rien ; ainsi, un contrôleur déplacé uniquement sur le côté indique qu’il n’est pas au sol dès qu’il s’arrête. Ce coursier marche avec les flèches et exerce une légère pression vers le bas à chaque déplacement :

public class Courier : MonoBehaviour
{
    public float speed = 6f;
    CharacterController controller;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = -2f;   // toujours pousser vers le bas pour détecter le sol
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

La capsule reste à l’écart de ce qu’elle touche d’une distance égale à sa largeur de peau (0.08) ; ainsi, un contrôleur de 2 unités de haut posé sur un sol à y = 0 se trouve à y = 1.08, et non à 1. Et Move part de l’endroit où la physique a vu le contrôleur pour la dernière fois ; ainsi, une position transform.position définie sur celui-ci peut être annulée par son prochain Move : pour le téléporter, définis controller.enabled = false, déplace-le, puis réactive-le.

challenge icon

Défi

Moyen

Déplace l’explorateur avec son CharacterController, afin que le mur l’arrête.

  1. Dans Update(), construis Vector3 move à partir de Input.GetAxisRaw("Horizontal") sur x et de Input.GetAxisRaw("Vertical") sur z, puis multiplie le résultat par speed.
  2. Définis move.y = -fallSpeed; et appelle controller.Move(move * Time.deltaTime);.
  3. Ensuite, définis rend.material.color sur Color.green lorsque controller.isGrounded est vrai, sinon sur Color.red.

Appuie sur « Jouer », avance jusqu’au mur puis dépasse le bord gauche : l’explorateur tombe en rouge et atterrit en vert. Ensuite, clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class Explorer : MonoBehaviour
{
    public float speed = 4f;
    public float fallSpeed = 3f;

    CharacterController controller;
    Renderer rend;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        rend = GetComponent<Renderer>();
    }

    void Update()
    {
        // Fais marcher l'explorateur avec controller.Move, puis colorie-le selon isGrounded
    }
}

Toutes les leçons de Créer de vrais jeux

Entraînez-vous par vous-même : Playground Unity