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.
Défi
Difficile- Dans
PowerUp, ajoutepublic enum Kind { Wide, Multiball }etpublic Kind kind(chaque prefab définit son type). AjouteOnTriggerEnter: lorsque le power-up touche l’objet portant le tagPaddle, un power-up Wide appelleWiden()sur le scriptPaddlede cet objet, et les deux types détruisent le power-up. - Dans
Paddle, ajoutepublic float wideFactor = 1.6fetpublic float wideSeconds = 8f, puis mémorise la largeur normale de la raquette, son échelle x, dansAwake(). - Écris
public void Widen(): cette méthode démarre une coroutine qui définit l’échelle x de la raquette àwideFactorfois sa largeur normale, attendwideSeconds, 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);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.