Menu
CoddyTech

Le parcours

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

Ce chapitre permet de créer un jeu de plateforme en 3D. Tu cours et sautes de plateforme flottante en plateforme flottante, tu en chevauches une qui glisse, tu touches des points de contrôle pour qu’une chute ne te renvoie pas au départ, tu ramasses des gemmes dont le nombre s’affiche à l’écran, tu franchis la ligne d’arrivée pour passer au niveau suivant et tu essaies de battre ton meilleur temps. Le jeu comprend cinq scripts, présents dans le projet dès le début : Player, MovingPlatform, Checkpoint, Gem et FinishLine. Les quatre derniers sont vides pour l’instant, et chaque leçon en remplit un. Le joueur est un CharacterController dirigé par les actions de l’Input System, et la caméra est son enfant : elle le suit donc sans script.

Un CharacterController se déplace de deux façons. Move(motion) le déplace d’une certaine distance sans rien ajouter ; la gravité, les sauts et Time.deltaTime sont donc à gérer dans le script, comme dans le chapitre sur le Character Controller. SimpleMove(speed) prend une vitesse en unités par seconde, la multiplie lui-même par le temps écoulé pendant la frame et ajoute la gravité ; il ignore la valeur y que tu lui transmets, donc un personnage déplacé avec cette méthode tombe des rebords, mais ne peut jamais sauter. Ce chien de berger, dans un jeu de rassemblement de troupeau vu de dessus, n’a pas besoin de sauter : SimpleMove et l’action Move constituent donc tout son script :

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

Le joueur du jeu de plateforme doit pouvoir sauter ; il conserve donc sa propre vitesse verticale et se déplace avec Move, en lisant les actions Move et Jump au lieu d’utiliser la classe Input. Unity recommande un seul appel à Move ou SimpleMove par frame : la marche et la chute sont prises en compte dans le même appel, et isGrounded décrit alors ce déplacement dans son ensemble.

challenge icon

Défi

Moyen

Fais marcher, sauter et tomber le personnage.

  1. Dans Start(), trouve Move et Jump avec InputSystem.actions.FindAction.
  2. Dans Update(), fais-le marcher à la vitesse speed : déplace x de Move sur x, et son y sur z.
  3. Ajoute gravity * Time.deltaTime à velocity.y, et -2f lorsqu’il est au sol et tombe. Lorsqu’il est au sol, le saut définit cette valeur sur Mathf.Sqrt(jumpHeight * -2f * gravity).
  4. Appelle controller.Move((move + velocity) * Time.deltaTime) une seule fois.

Appuie sur « Jouer » : saute jusqu’à la première plateforme. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;

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

    void Update()
    {
        // se déplacer avec l'action Move, sauter avec l'action Jump, tomber sous l'effet de la gravité
    }
}

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

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