Menu
CoddyTech

Apunta con la paleta

Lección 4 de 19 del curso Juego en Unity: Rompe ladrillos de Coddy.

Con un rebote perfecto, el jugador no puede apuntar. En los juegos de romper ladrillos, la paleta decide: un golpe cerca del extremo izquierdo envía la pelota hacia arriba y a la izquierda; un golpe en el centro la envía directamente hacia arriba.

Convierte el golpe en un número que va de -1 en el extremo izquierdo a 1 en el derecho: el desplazamiento de la pelota en x respecto al centro de la paleta, dividido por la mitad del ancho de la paleta. Una paleta de 4 de ancho centrada en x 2, golpeada en x 3: el desplazamiento es 1, la mitad del ancho es 2, así que el número es 0.5 y la pelota sale en la dirección (0.5, 1, 0), normalizada. Limita el valor, ya que la pelota puede tocar una esquina un poco más allá del extremo.

OnCollisionEnter se ejecuta después de que la física haya calculado el rebote, así que una velocidad establecida ahí lo reemplaza. Las paredes también la desvían y mantienen su rebote normal, así que comprueba primero la etiqueta. collision.collider.bounds.size.x es el ancho de la paleta en el mundo.

challenge icon

Desafío

Fácil

Apunta la pelota con la paleta: el lugar donde cae determina el ángulo.

  1. En Ball, agrega OnCollisionEnter(Collision collision); retorna a menos que el objeto golpeado tenga la etiqueta Paddle.
  2. Calcula float x: la coordenada x de la pelota menos la coordenada x de la paleta, dividido entre la mitad de collision.collider.bounds.size.x, limitado entre -1 y 1.
  3. Establece rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

Pulsa «Jugar» y atrapa la pelota con el extremo izquierdo de la paleta: saldrá disparada hacia la izquierda. Después, pulsa «Comprobar».

Pruébalo tú mismo

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;
    }
}

Todas las lecciones de Juego en Unity: Rompe ladrillos

Practica por tu cuenta: Playground de Unity