Perder una pelota
Lección 8 de 19 del curso Juego en Unity: Rompe ladrillos de Coddy.
Una pelota que pasa la pala se pierde. Debajo de la pala, la escena ahora tiene una DeathZone: un objeto con un colisionador de caja configurado como Is Trigger y la etiqueta DeathZone. Un trigger no detiene nada; envía OnTriggerEnter(Collider other) cuando algo con un Rigidbody entra en él. La pelota informa de la pérdida al GameManager, que controla las vidas y decide qué sucede después.
Una canica que cae al agua vuelve a empezar en su punto de aparición:
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Water")) Respawn();
}
void Respawn()
{
rb.linearVelocity = Vector3.zero;
transform.position = spawnPoint.position;
}La pelota necesita menos que la canica. Su Update() ya la coloca sobre la pala en cada fotograma mientras launched sea false, así que para reiniciarla solo hay que borrar esa marca y detener la pelota: el siguiente fotograma la lleva de vuelta, y la barra espaciadora vuelve a lanzarla.
Desafío
IntermedioPerder la pelota cuesta una vida y la devuelve a la paleta.
- En
Ball, escribepublic void ResetToPaddle():launched = false;y la velocidadVector3.zero. - En
OnTriggerEnterde Ball, entrar en el objeto etiquetado comoDeathZonellama aGameManager.Instance.BallLost(this). - En
GameManager, añadepublic int lives = 3;ypublic void BallLost(Ball lost): resta una vida y despuéslost.ResetToPaddle();
Pulsa «Jugar» y deja pasar la pelota: vuelve a esperar sobre la paleta. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Brick brickPrefab;
public Transform wall;
public int rows = 5;
public int columns = 9;
public float spacingX = 1.75f;
public float spacingY = 0.75f;
public float topY = 6f;
public int[] rowHits = { 2, 1, 1, 1, 1 };
int score;
void Awake()
{
Instance = this;
}
void Start()
{
BuildWall();
}
void BuildWall()
{
float left = -(columns - 1) * spacingX / 2f;
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < columns; col++)
{
Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
brick.SetHits(rowHits[row]);
}
}
}
public void BrickBroken(Brick brick)
{
score += brick.points;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego en Unity: Rompe ladrillos
Practica por tu cuenta: Playground de Unity