Apunta con la paleta
Lección 4 de 16 del curso Juego en Unity: Rompebloques de Coddy.
Con un rebote perfecto, el jugador no puede apuntar: la pelota sale de la paleta en el mismo ángulo con el que llegó. En los juegos Breakout, la paleta decide el ángulo. Un golpe cerca del extremo izquierdo envía la pelota hacia arriba y a la izquierda; un golpe en el medio la envía directamente hacia arriba, y cuanto más lejos del medio, más amplio es el ángulo.
Convierte el golpe en un número de -1 en el extremo izquierdo a 1 en el extremo derecho: el desplazamiento en x de la pelota respecto al centro de la paleta, dividido por la mitad del ancho de la paleta. Supongamos que la paleta tiene 4 unidades de ancho y su centro está en x = 2, y que la pelota golpea en x = 3. El desplazamiento es 1, la mitad del ancho es 2, así que el número es 0.5, y la nueva dirección es 0.5 hacia un lado y 1 hacia arriba, (0.5, 1, 0), normalizada. Un golpe justo en un extremo da 1 o -1, lo que corresponde a 45 grados respecto a la vertical. Limita el número a ese rango, porque la pelota puede tocar la esquina de la paleta un poco más allá del extremo.
El método OnCollisionEnter de la pelota se ejecuta después de que la física haya calculado el rebote, así que una velocidad establecida ahí la reemplaza. Las paredes envían el mismo mensaje y deben mantener su rebote normal, así que primero comprueba qué recibió el golpe. collision.collider.bounds es la caja que ocupa el colisionador en el mundo, con la escala incluida:
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);
}Desafío
FácilAñade OnCollisionEnter(Collision collision) a Ball:
- No hagas nada a menos que el objeto golpeado tenga la etiqueta
Paddle. - Calcula
x: la x de la pelota menos la x de la paleta, dividido por la mitad del ancho de la paleta (collision.collider.bounds.size.x), limitado entre -1 y 1. - Establece la velocidad del Rigidbody en
new Vector3(x, 1f, 0f), normalizada y multiplicada porspeed.
Presiona Play, atrapa la pelota cerca de cada extremo de la paleta y después Check.
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.