Viser avec la raquette
Leçon 4 sur 16 du cours Jeu Unity : casse-briques de Coddy.
Avec un rebond parfait, le joueur ne peut pas viser : la balle quitte la raquette avec le même angle qu'à son arrivée. Dans les jeux de casse-briques, c'est plutôt la raquette qui décide. Un impact près de l'extrémité gauche envoie la balle vers le haut et la gauche, un impact au milieu l'envoie tout droit vers le haut, et plus l'impact est éloigné du milieu, plus l'angle est large.
Convertis l'impact en un nombre allant de -1 à l'extrémité gauche à 1 à l'extrémité droite : le décalage en x de la balle par rapport au centre de la raquette, divisé par la moitié de la largeur de la raquette. Supposons que la raquette fasse 4 unités de large et que son centre soit en x = 2, et que la balle la frappe en x = 3. Le décalage est de 1, la moitié de la largeur est de 2, donc le nombre est de 0.5, et la nouvelle direction est de 0.5 vers la droite et 1 vers le haut, (0.5, 1, 0), normalisée. Un impact exactement à une extrémité donne 1 ou -1, soit un angle de 45 degrés par rapport à la verticale. Limite le nombre à cette plage, car la balle peut toucher le coin de la raquette légèrement au-delà de l'extrémité.
La méthode OnCollisionEnter de la balle s'exécute après que le moteur physique a calculé le rebond, donc une vitesse définie à cet endroit la remplace. Les murs envoient le même message et doivent conserver leur rebond normal : vérifie donc d'abord ce qui a été touché. collision.collider.bounds correspond à la boîte occupée par le collider dans le monde, échelle comprise :
void OnCollisionEnter(Collision collision)
{
Bounds box = collision.collider.bounds;
Debug.Log(collision.gameObject.name + " is " + box.size.x + " wide, centered at x = " + box.center.x);
}Défi
FacileAjoute OnCollisionEnter(Collision collision) à Ball :
- Ne fais rien sauf si l’objet touché porte l’étiquette
Paddle. - Calcule
x: la coordonnée x de la balle moins celle de la raquette, divisée par la moitié de la largeur de la raquette (collision.collider.bounds.size.x), et limitée entre -1 et 1. - Définis la vélocité du Rigidbody sur
new Vector3(x, 1f, 0f), normalisée, multipliée parspeed.
Appuie sur Play, rattrape la balle près de chaque extrémité de la raquette, 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>();
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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.