Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio
  1. En Ball, escribe public void ResetToPaddle(): la pelota deja de estar lanzada y deja de moverse.
  2. Añade OnTriggerEnter a Ball: cuando entre en el objeto etiquetado como DeathZone, llama a GameManager.Instance.BallLost(this).
  3. En GameManager, añade public int lives = 3 y public 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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego en Unity: Rompebloques