La paleta
Lección 1 de 16 del curso Juego en Unity: Rompebloques de Coddy.
En este curso construirás Brick Breaker en 3D: una paleta en la parte inferior, una pelota que rebota entre las paredes y una pared de ladrillos que romper. Cada lección añade una característica: los ladrillos, las vidas, los niveles, una pantalla de fin de partida y potenciadores que ensanchan la paleta o dividen la pelota. La escena está lista: la cámara mira el campo de juego desde delante y todo se mueve en el plano x e y en z = 0. Por ahora, los scripts Paddle, Ball, Brick, GameManager y PowerUp son esqueletos breves.
La paleta tiene un Rigidbody cinemático, que se mueve con MovePosition en FixedUpdate, para que la física detecte su movimiento y, más adelante, la pelota pueda rebotar en ella. Un cuerpo cinemático nunca es detenido por colliders que no tienen Rigidbody, así que las paredes laterales no lo frenarán: el script lo mantiene dentro. Limitar el centro a la altura de la pared dejaría la mitad del objeto dentro de ella, por lo que el límite es la pared menos la mitad del tamaño del objeto. Este ascensor en un hueco de y = 0 a y = 12 lo hace en y:
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);Aquí, input es 1 al subir, -1 al bajar y 0 en cualquier otro caso. Un ascensor de 2 unidades de alto mantiene su centro entre 1 y 11, así que sus extremos se detienen justo en 0 y 12. Un primitivo Cube mide 1 unidad por lado, así que localScale.y es la altura del ascensor, y leerlo en cada paso mantiene el límite correcto si el tamaño cambia mientras se ejecuta el juego.
Desafío
FácilEscribe el movimiento de la paleta en FixedUpdate() de Paddle:
- Crea un
float input: -1 mientras se mantenga pulsada la flecha izquierda o A, 1 mientras se mantenga pulsada la flecha derecha o D, 0 en caso contrario. - Calcula el objetivo: la posición del Rigidbody desplazada hacia la derecha por
input * speed * Time.fixedDeltaTime. - Limita la x del objetivo para que los extremos de la paleta se detengan en las caras interiores de las paredes,
-wallXywallX. El ancho de la paleta estransform.localScale.x. - Muévela hasta allí con
rb.MovePosition.
Pulsa Play, desliza la paleta hasta ambas paredes y después pulsa Check.
Pruébalo tú mismo
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // las caras interiores de las paredes laterales están en -wallX y wallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// Muévete con las flechas o con A y D, y mantente entre las paredes.
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.