Perdere una palla
Lezione 8 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.
Una pallina che supera la racchetta è persa. Sotto la racchetta, la scena ora ha una DeathZone: un oggetto con un collider a scatola impostato su Is Trigger e il tag DeathZone. Un trigger non ferma nulla; invia OnTriggerEnter(Collider other) quando qualcosa con un Rigidbody vi entra. La pallina segnala la perdita a GameManager, che gestisce le vite e decide cosa succede dopo.
Una biglia che cade in acqua ricomincia dal punto di spawn:
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Water")) Respawn();
}
void Respawn()
{
rb.linearVelocity = Vector3.zero;
transform.position = spawnPoint.position;
}La pallina ha bisogno di meno della biglia. Il suo Update() la posiziona già sulla racchetta a ogni frame mentre launched è false, quindi per reimpostarla basta azzerare quel flag e fermare la pallina: al frame successivo tornerà sulla racchetta e premendo la barra spaziatrice verrà lanciata di nuovo.
Sfida
Medio- In
Ball, scrivipublic void ResetToPaddle(): la pallina non è più lanciata e smette di muoversi. - Aggiungi
OnTriggerEnteraBall: quando entra nell’oggetto con tagDeathZone, chiamaGameManager.Instance.BallLost(this). - In
GameManager, aggiungipublic int lives = 3epublic void BallLost(Ball lost): una vita in meno e la pallina persa torna sulla racchetta.
Non c’è ancora il game over, quindi per ora le vite possono scendere sotto 0.
Premi Play, manca apposta la pallina, rilanciala e poi premi Check.
Provalo tu
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.