Perder una pelota
Lección 8 de 16 del curso Juego en Unity: Rompebloques 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
Intermedio- En
Ball, escribepublic void ResetToPaddle(): la pelota deja de estar lanzada y deja de moverse. - Añade
OnTriggerEnteraBall: cuando entre en el objeto etiquetado comoDeathZone, llama aGameManager.Instance.BallLost(this). - En
GameManager, añadepublic int lives = 3ypublic void BallLost(Ball lost): se pierde una vida y la pelota perdida vuelve a la paleta.
Todavía no hay fin de la partida, así que por ahora las vidas pueden bajar de 0.
Pulsa Play, falla la pelota a propósito, lánzala de nuevo y después pulsa Check.
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.