Menu
CoddyTech

Mantén la velocidad

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

Una pelota de Brick Breaker nunca pierde velocidad. Su PhysicsMaterial hace la mayor parte del trabajo: un rebote de 1 conserva toda la velocidad tras el rebote, y una fricción de 0 impide que las paredes la frenen. Las paredes no tienen material, y Unity calcula de forma predeterminada el promedio de los valores de los dos colisionadores: el 1 de la pelota y el 0 de una pared hacen que el rebote sea a la mitad de la velocidad. bounceCombine = Maximum y frictionCombine = Minimum hacen que prevalezcan los valores propios de la pelota.

La física aún no es exacta: una pala en movimiento añade su velocidad, y los pequeños errores se acumulan a lo largo de cientos de rebotes. Por eso, en cada paso de la física, la pelota conserva su dirección y se le vuelve a establecer la velocidad:

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

Una pelota cuya velocidad se ha reducido a 2 unidades por segundo vuelve a moverse a 7 en el siguiente paso.

challenge icon

Desafío

Fácil

Haz que la pelota rebote para siempre a una velocidad constante.

  1. En Awake() de Ball, crea new PhysicsMaterial("Bouncy") con un rebote de 1 y ambas fricciones en 0; establece bounceCombine = PhysicsMaterialCombine.Maximum y frictionCombine = PhysicsMaterialCombine.Minimum; asígnalo a GetComponent<Collider>().material.
  2. Añade FixedUpdate(): si se ha lanzado, rb.linearVelocity = rb.linearVelocity.normalized * speed;

Presiona «Jugar» y lanza la pelota: rebotará en todas las paredes sin perder velocidad. Después, «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>();
    }

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

Todas las lecciones de Juego en Unity: Rompe ladrillos

Practica por tu cuenta: Playground de Unity