Mira con la racchetta
Lezione 4 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.
Con un rimbalzo perfetto, il giocatore non può mirare: la palla lascia la paletta con l'angolo con cui è arrivata. Nei giochi Brick Breaker, invece, è la paletta a decidere. Un colpo vicino all'estremità sinistra manda la palla in alto e a sinistra, un colpo al centro la manda dritta in alto e, più il colpo è lontano dal centro, più ampio è l'angolo.
Trasforma il punto d'impatto in un numero compreso tra -1 all'estremità sinistra e 1 all'estremità destra: lo scostamento della palla rispetto al centro della paletta sull'asse x, diviso per metà della larghezza della paletta. Supponiamo che la paletta sia larga 4 unità, con il centro in x = 2, e che la palla colpisca in x = 3. Lo scostamento è 1, metà della larghezza è 2, quindi il numero è 0.5 e la nuova direzione è 0.5 verso destra e 1 verso l'alto, (0.5, 1, 0), normalizzata. Un colpo esattamente a un'estremità dà 1 o -1, cioè un angolo di 45 gradi rispetto alla verticale. Limita il numero a questo intervallo, perché la palla può toccare l'angolo della paletta un po' oltre l'estremità.
Il metodo OnCollisionEnter della palla viene eseguito dopo che la fisica ha calcolato il rimbalzo, quindi una velocità impostata lì la sostituisce. Anche i muri inviano lo stesso messaggio e devono mantenere il loro rimbalzo normale, quindi controlla prima che cosa è stato colpito. collision.collider.bounds è il riquadro occupato dal collider nel mondo, scala inclusa:
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);
}Sfida
FacileAggiungi OnCollisionEnter(Collision collision) a Ball:
- Non fare nulla, a meno che l’oggetto colpito non abbia il tag
Paddle. - Calcola
x: la coordinata x della palla meno la coordinata x della racchetta, diviso per metà della larghezza della racchetta (collision.collider.bounds.size.x), mantenuto tra -1 e 1. - Imposta la velocità del Rigidbody su
new Vector3(x, 1f, 0f), normalizzata, moltiplicata perspeed.
Premi Play, intercetta la palla vicino a ciascuna estremità della racchetta, quindi premi Check.
Provalo tu
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.