Menu
CoddyTech

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);
}
challenge icon

Sfida

Facile

Aggiungi OnCollisionEnter(Collision collision) a Ball:

  1. Non fare nulla, a meno che l’oggetto colpito non abbia il tag Paddle.
  2. 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.
  3. Imposta la velocità del Rigidbody su new Vector3(x, 1f, 0f), normalizzata, moltiplicata per speed.

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;
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: Rompi-mattoni