Menu
CoddyTech

Viser avec la raquette

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

Avec un rebond parfait, le joueur ne peut pas viser. Dans les jeux de casse-briques, c’est la raquette qui détermine la trajectoire : un impact près de l’extrémité gauche envoie la balle vers le haut et la gauche, tandis qu’un impact au milieu l’envoie tout droit vers le haut.

Transforme l’impact en un nombre compris entre -1 à l’extrémité gauche et 1 à l’extrémité droite : le décalage de la balle sur l’axe x par rapport au centre de la raquette, divisé par la moitié de la largeur de la raquette. Pour une raquette de largeur 4 centrée en x 2, frappée en x 3 : le décalage est de 1, la moitié de la largeur est de 2, donc le nombre est 0.5 et la balle part dans la direction (0.5, 1, 0), normalisée. Limite cette valeur, car la balle peut toucher un coin légèrement au-delà de l’extrémité.

OnCollisionEnter s’exécute après que le moteur physique a calculé le rebond ; une vitesse définie à cet endroit le remplace. Les murs envoient aussi la balle et conservent leur rebond normal : vérifie donc d’abord le tag. collision.collider.bounds.size.x correspond à la largeur de la raquette dans le monde.

challenge icon

Défi

Facile

Vise la balle avec la raquette : l’endroit où elle atterrit détermine l’angle.

  1. Dans Ball, ajoute OnCollisionEnter(Collision collision) ; quitte la méthode si l’objet touché n’est pas marqué avec le tag Paddle.
  2. Calcule float x : la position x de la balle moins celle de la raquette, divisée par la moitié de collision.collider.bounds.size.x, puis limitée entre -1 et 1.
  3. Définis rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

Appuie sur « Jouer » et rattrape la balle à l’extrémité gauche de la raquette : elle repart vers la gauche. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
        PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
        bouncy.bounciness = 1f;
        bouncy.dynamicFriction = 0f;
        bouncy.staticFriction = 0f;
        bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
        bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
        GetComponent<Collider>().material = bouncy;
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }

    void FixedUpdate()
    {
        if (!launched) return;
        rb.linearVelocity = rb.linearVelocity.normalized * speed;
    }
}

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

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