Menu
CoddyTech

Raquette élargie

Leçon 14 sur 16 du cours Jeu Unity : casse-briques de Coddy.

Un bonus Wide attrapé avec la raquette l’élargit pendant quelques secondes. Le bonus détecte qu’il a été attrapé : son collider de déclenchement touche celui de la raquette, et les deux corps sont cinématiques, ce qui suffit pour OnTriggerEnter. Il traverse aussi la balle en tombant, alors il vérifie le tag. Une énumération contenant les types, définie pour chaque prefab dans l’Inspector, permet de distinguer les bonus.

Un effet temporaire est une coroutine : modifier, attendre, rétablir. Si un deuxième bonus est attrapé alors que le premier est encore actif, le décompte doit repartir de zéro. Il faut donc conserver la Coroutine renvoyée par StartCoroutine et l’arrêter avant d’en démarrer une nouvelle. Sinon, la première se termine prématurément et annule la deuxième. Un boost de vitesse :

Coroutine boost;

public void Boost()
{
    if (boost != null) StopCoroutine(boost);
    boost = StartCoroutine(BoostFor(3f));
}

IEnumerator BoostFor(float seconds)
{
    speed = normalSpeed * 2f;
    yield return new WaitForSeconds(seconds);
    speed = normalSpeed;
    boost = null;
}

Le boost définit la vitesse à partir de normalSpeed, mémorisée une seule fois, au lieu de doubler la vitesse actuelle puis de la diviser par deux plus tard : deux boosts d’affilée la rendraient 4 fois plus rapide. La limite de la raquette lit déjà sa largeur à chaque étape, donc une raquette élargie s’arrête toujours aux murs.

challenge icon

Défi

Difficile
  1. Dans PowerUp, ajoute public enum Kind { Wide, Multiball } et public Kind kind (chaque prefab définit son type). Ajoute OnTriggerEnter : lorsque le power-up touche l’objet portant le tag Paddle, un power-up Wide appelle Widen() sur le script Paddle de cet objet, et les deux types détruisent le power-up.
  2. Dans Paddle, ajoute public float wideFactor = 1.6f et public float wideSeconds = 8f, puis mémorise la largeur normale de la raquette, son échelle x, dans Awake().
  3. Écris public void Widen() : cette méthode démarre une coroutine qui définit l’échelle x de la raquette à wideFactor fois sa largeur normale, attend wideSeconds, puis rétablit la largeur normale. Une nouvelle capture pendant que la raquette est élargie relance le compte à rebours.

Un power-up Multiball est attrapé, mais ne fait encore rien.

Appuie sur Play, attrape un power-up vert, puis appuie sur Check.

Essayez vous-même

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // les faces intérieures des murs latéraux se trouvent à -wallX et wallX

    Rigidbody rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Unity : casse-briques