Mantén la velocidad
Lección 3 de 16 del curso Juego en Unity: Rompebloques de Coddy.
Una pelota de Brick Breaker nunca pierde velocidad. Su PhysicsMaterial hace la mayor parte del trabajo: una elasticidad de 1 conserva toda la velocidad tras un rebote, y una fricción de 0 evita que las paredes frenen o hagan girar la pelota. Las paredes y los ladrillos no tienen material propio, y Unity combina los valores de los dos colisionadores, de forma predeterminada con Average: el 1 de la pelota y el 0 predeterminado de una pared hacen que el rebote se produzca a la mitad de velocidad. bounceCombine = Maximum y frictionCombine = Minimum permiten que prevalezcan los valores propios de la pelota frente a cualquier cosa que golpee.
La física sigue sin ser exacta: una paleta en movimiento añade su propia velocidad al rebote, dos pelotas se empujan entre sí y los pequeños errores se acumulan a lo largo de cientos de rebotes. Por eso, en cada FixedUpdate, la pelota conserva su dirección y se restablece su velocidad. El Rigidbody de la pelota también tiene marcada la opción Freeze Position Z en el Inspector, lo que la mantiene en el plano de juego.
Un juego diferente requiere una regla diferente. Un disco de hockey de aire puede perder velocidad, pero nunca superar un límite, y Vector3.ClampMagnitude acorta un vector demasiado largo y deja intacto uno más corto:
void FixedUpdate()
{
rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}Un límite no basta para la pelota: si su velocidad baja a 2 unidades por segundo, se quedaría en 2. Necesita que se establezca su velocidad exacta a partir de su dirección.
Desafío
FácilEn Ball:
- En
Awake(), crea unnew PhysicsMaterial("Bouncy")con un rebote de 1, fricción dinámica y estática de 0,bounceCombineen Maximum yfrictionCombineen Minimum, y asígnalo al collider de la pelota conGetComponent<Collider>().material. - Añade
FixedUpdate(): mientras la pelota esté en movimiento, establece sulinearVelocityen su dirección actual multiplicada porspeed.
En Unity también puedes crear el material como un recurso (Create > Physics Material) y arrastrarlo hasta la ranura Material del Sphere Collider; aquí lo crea el script.
Pulsa Play, lanza la pelota y observa cómo rebota; después, pulsa 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>();
}
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.