Mira con la racchetta
Lezione 4 di 19 del corso Gioco in Unity: Rompi i mattoni di Coddy.
Con un rimbalzo perfetto, il giocatore non può mirare. Nei giochi Brick Breaker è la racchetta a decidere: un colpo vicino all'estremità sinistra manda la palla in alto e a sinistra, un colpo al centro la manda dritta verso l'alto.
Trasforma il colpo in un numero da -1 all'estremità sinistra a 1 a quella destra: lo scarto in x della palla rispetto al centro della racchetta, diviso per metà della larghezza della racchetta. Una racchetta larga 4, centrata su x 2, colpita su x 3: lo scarto è 1, metà della larghezza è 2, quindi il numero è 0.5 e la palla parte lungo (0.5, 1, 0), normalizzato. Limitalo, perché la palla può toccare un angolo appena oltre l'estremità.
OnCollisionEnter viene eseguito dopo che la fisica ha calcolato il rimbalzo, quindi una velocità impostata lì lo sostituisce. Anche i muri la rimandano indietro e mantengono il loro rimbalzo normale, quindi controlla prima il tag. collision.collider.bounds.size.x è la larghezza della racchetta nel mondo.
Sfida
FacileMira la palla con la racchetta: il punto in cui atterra determina l’angolo.
- In
Ball, aggiungiOnCollisionEnter(Collision collision); esci se l’oggetto colpito non ha il tagPaddle. - Calcola
float x: la x della palla meno la x della racchetta, diviso la metà dicollision.collider.bounds.size.x, limitato tra -1 e 1. - Imposta
rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;
Premi «Gioca» e intercetta la palla con l’estremità sinistra della racchetta: volerà verso sinistra. Poi premi «Verifica».
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;
}
}
Tutte le lezioni di Gioco in Unity: Rompi i mattoni
Esercitati da solo: Playground Unity