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.
Desafío
FácilHaz que la pelota rebote para siempre a una velocidad constante.
- En
Awake()deBall, creanew PhysicsMaterial("Bouncy")con un rebote de 1 y ambas fricciones en 0; establecebounceCombine = PhysicsMaterialCombine.MaximumyfrictionCombine = PhysicsMaterialCombine.Minimum; asígnalo aGetComponent<Collider>().material. - 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