Menu
CoddyTech

Collision

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

Les obstacles sont des déclencheurs : ils détectent le coureur sans le repousser. Lorsque le CharacterController du coureur et un déclencheur se rencontrent, Unity appelle OnTriggerEnter dans les scripts du coureur, en lui transmettant le collider du déclencheur :

void OnTriggerEnter(Collider other)
{
    if (game.over) return;
    if (other.CompareTag("Obstacle"))
    {
        game.GameOver();
    }
}

GameOver met fin à la course : over devient true, la vitesse passe à 0 pour que la route s'arrête, et le message au milieu de l'écran l'indique. Tant que over est true, le GameManager cesse de compter la distance et le Runner cesse de lire les touches.

challenge icon

Défi

Moyen
  1. Dans GameManager, ajoute public TMP_Text messageText; et public bool over;.
  2. Ajoute public void GameOver() : si over est déjà vrai, retourne ; sinon, définis over = true, speed = 0f et messageText.text = "Game over".
  3. Au début de Update de GameManager, ajoute if (over) return;.
  4. Dans Runner, trouve le GameManager dans Start, lis les touches uniquement lorsque !game.over, et ajoute OnTriggerEnter comme ci-dessus.

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 float slideTime = 0.7f;

    public int lane;

    private CharacterController controller;
    private float fallSpeed;
    private float slide;

    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);
            StopSlide();
        }
        if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
        {
            slide = slideTime;
            Resize(0.5f);
        }

        if (slide > 0f)
        {
            slide -= Time.deltaTime;
            if (slide <= 0f) StopSlide();
        }

        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);
    }

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

    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;
    }
}

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

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