Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Mira la palla con la racchetta: il punto in cui atterra determina l’angolo.

  1. In Ball, aggiungi OnCollisionEnter(Collision collision); esci se l’oggetto colpito non ha il tag Paddle.
  2. Calcola float x: la x della palla meno la x della racchetta, diviso la metà di collision.collider.bounds.size.x, limitato tra -1 e 1.
  3. 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