Menu
CoddyTech

Garder la vitesse

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

Une balle de casse-briques ne ralentit jamais. Son PhysicsMaterial fait l’essentiel du travail : une élasticité de 1 conserve toute la vitesse après un rebond, et un frottement de 0 empêche les murs de ralentir ou de faire tourner la balle. Les murs et les briques n’ont pas de matériau qui leur est propre, et Unity combine les valeurs des deux colliders, par défaut avec Average : le 1 de la balle et le 0 par défaut d’un mur donnent un rebond à la moitié de la vitesse. bounceCombine = Maximum et frictionCombine = Minimum permettent aux valeurs propres de la balle de l’emporter sur celles de tout ce qu’elle touche.

La physique n’est toujours pas exacte : une raquette en mouvement ajoute sa propre vitesse au rebond, deux balles se repoussent et de petites erreurs s’accumulent au fil de centaines de rebonds. Ainsi, à chaque FixedUpdate, la balle conserve sa direction et sa vitesse est réinitialisée. Dans l’inspecteur, l’option Freeze Position Z du Rigidbody de la balle est également cochée, ce qui la maintient dans le plan de jeu.

Un autre jeu nécessite une autre règle. Un palet de hockey sur air peut ralentir, mais ne jamais dépasser une limite de vitesse, et Vector3.ClampMagnitude raccourcit un vecteur trop long et laisse tel quel un vecteur plus court :

void FixedUpdate()
{
    rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}

Une limite ne suffit pas pour la balle : si sa vitesse est réduite à 2 unités par seconde, elle restera à 2. Sa vitesse doit être réinitialisée exactement, en fonction de sa direction.

challenge icon

Défi

Facile

Dans Ball :

  1. Dans Awake(), crée un new PhysicsMaterial("Bouncy") avec une élasticité de 1, une friction dynamique et statique de 0, bounceCombine réglé sur Maximum et frictionCombine réglé sur Minimum, puis attribue-le au collider de la balle avec GetComponent<Collider>().material.
  2. Ajoute FixedUpdate() : tant que la balle est lancée, définis sa linearVelocity comme sa direction actuelle multipliée par speed.

Dans Unity, tu peux aussi créer le matériau comme un asset (Create > Physics Material) et le faire glisser sur l’emplacement Material du Sphere Collider ; ici, le script le crée.

Appuie sur Play, lance la balle et regarde-la rebondir, puis clique sur Check.

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

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