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.
Défi
FacileDans Ball :
- Dans
Awake(), crée unnew PhysicsMaterial("Bouncy")avec une élasticité de 1, une friction dynamique et statique de 0,bounceCombineréglé sur Maximum etfrictionCombineréglé sur Minimum, puis attribue-le au collider de la balle avecGetComponent<Collider>().material. - Ajoute
FixedUpdate(): tant que la balle est lancée, définis salinearVelocitycomme sa direction actuelle multipliée parspeed.
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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.