Menu
CoddyTech

Glisser

Leçon 4 sur 20 du cours Jeu Unity : Voies célestes de Coddy.

Certains obstacles sont suspendus trop haut pour qu’on puisse sauter par-dessus : le coureur glisse dessous. Pendant un instant, le coureur fait la moitié de sa taille lorsqu’il glisse.

Réduire la taille de l’objet réduit aussi celle de son CharacterController, mais la réduction se fait autour du milieu : les pieds flotteraient donc à une demi-unité au-dessus de la route. Abaisse le coureur de cette même demi-unité. Un contrôleur doit être désactivé pendant que tu le déplaces manuellement, sinon son prochain Move annule le changement :

void Resize(float height)
{
    controller.enabled = false;
    transform.position += Vector3.up * (height - transform.localScale.y);
    transform.localScale = new Vector3(1f, height, 1f);
    controller.enabled = true;
}

Un minuteur, slide, décompte la glissade. Lorsqu’il arrive à zéro, le coureur se redresse avec StopSlide :

void StopSlide()
{
    if (transform.localScale.y < 1f) Resize(1f);
    slide = 0f;
}
challenge icon

Défi

Facile
  1. Ajoutez public float slideTime = 0.7f; et private float slide;.
  2. Ajoutez Resize et StopSlide comme ci-dessus.
  3. Lorsque vous appuyez sur S ou sur la flèche vers le bas au sol, définissez slide = slideTime et appelez Resize(0.5f).
  4. À chaque image, si slide > 0f, soustrayez-lui Time.deltaTime et appelez StopSlide() dès qu’il atteint 0.
  5. Un saut met fin à une glissade : appelez StopSlide() lorsque le coureur saute.

Essayez vous-même

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 16f;
    public float jumpHeight = 1.6f;
    public float gravity = -40f;

    public int lane;

    private CharacterController controller;
    private float fallSpeed;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
        if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
        bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
        if (jump && controller.isGrounded)
        {
            fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }

        if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
        fallSpeed += gravity * Time.deltaTime;

        float targetX = lane * laneWidth;
        float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
        Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
        controller.Move(move);
    }
}

Toutes les leçons de Jeu Unity : Voies célestes

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