Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

En Ball:

  1. En Awake(), crea un new PhysicsMaterial("Bouncy") con un rebote de 1, fricción dinámica y estática de 0, bounceCombine en Maximum y frictionCombine en Minimum, y asígnalo al collider de la pelota con GetComponent<Collider>().material.
  2. Añade FixedUpdate(): mientras la pelota esté en movimiento, establece su linearVelocity en su dirección actual multiplicada por speed.

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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego en Unity: Rompebloques