Menu
CoddyTech

Raquette élargie

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

Un effet temporaire est une coroutine : modifier, attendre, rétablir. Si une deuxième prise a lieu pendant que la première est active, le compte à rebours doit recommencer ; conserve donc la Coroutine renvoyée par StartCoroutine et arrête-la avant d’en démarrer une nouvelle. Sinon, la première se termine trop tôt et annule la deuxième. Voici une accélération :

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

La vitesse est définie à partir de normalSpeed, conservée une seule fois, plutôt que de doubler la vitesse actuelle : deux accélérations à la suite la rendraient 4 fois plus rapide. La limite de déplacement de la raquette lit sa largeur à chaque étape, donc une raquette large s’arrête quand même aux murs.

challenge icon

Défi

Difficile

Un bonus d’élargissement rend la raquette plus large pendant 8 secondes.

  1. Dans Paddle, ajoute public float wideFactor = 1.6f; et public float wideSeconds = 8f;, et conserve l’échelle x normale dans Awake.
  2. Widen() arrête la coroutine en cours, s’il y en a une, et en démarre une : échelle x égale à wideFactor fois l’échelle normale, attendre wideSeconds, puis revenir à la normale.
  3. La coroutine nécessite using System.Collections;.

Appuie sur « Jouer » et attrape un bonus vert : la raquette s’agrandit, puis reprend sa taille normale. Ensuite, clique sur « Vérifier ».

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

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

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

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