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.
Défi
DifficileUn bonus d’élargissement rend la raquette plus large pendant 8 secondes.
- Dans
Paddle, ajoutepublic float wideFactor = 1.6f;etpublic float wideSeconds = 8f;, et conserve l’échelle x normale dans Awake. - Widen() arrête la coroutine en cours, s’il y en a une, et en démarre une : échelle x égale à
wideFactorfois l’échelle normale, attendrewideSeconds, puis revenir à la normale. - 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
4Bonus
Objets qui tombentEntraînez-vous par vous-même : Playground Unity