Bola Terakhir yang Dihitung
Pelajaran 18 dari 19 dalam kursus Game Unity: Brick Breaker di Coddy.
Dengan tiga bola yang sedang dimainkan, bola yang hilang hanya mengurangi satu nyawa jika itu bola terakhir. Sebelum itu, bola tersebut dikeluarkan dari list dan dihancurkan. Slime yang terpecah bekerja dengan cara yang sama:
public void SlimeDied(Slime slime)
{
slimes.Remove(slime);
Destroy(slime.gameObject);
if (slimes.Count == 0) Debug.Log("Room cleared");
}Bola awal bisa hilang sementara bola-bola salinannya terus melaju, jadi bola pertama dalam list mungkin berupa salinan. Kode yang membutuhkan “bola tersebut”, seperti kode untuk menuntaskan level, menggunakan balls[0], bukan field Ball dari scene.
Tantangan
SulitKehilangan bola tambahan tidak mengurangi nyawa.
- Di bagian atas
BallLost: jikaballs.Count > 1, jalankanballs.Remove(lost);, hancurkan objeknya, lalu kembalikan eksekusi. - Saat level selesai, panggil
balls[0].ResetToPaddle(), bukanball.ResetToPaddle().
Tekan tombol “Main”, pecah bola dan biarkan dua bola terlewat: nyawa tetap ada sampai bola terakhir jatuh. Lalu tekan tombol “Periksa”.
Coba sendiri
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Brick brickPrefab;
public Transform wall;
public string[] levels;
public float spacingX = 1.75f;
public float spacingY = 0.75f;
public float topY = 6f;
public Ball ball;
public int lives = 3;
public TMP_Text scoreText;
public TMP_Text livesText;
public GameObject gameOverPanel;
public GameObject[] powerUps;
public float dropChance = 0.15f;
int score;
int level;
int bricksLeft;
List<Ball> balls = new List<Ball>();
void Awake()
{
Instance = this;
}
void Start()
{
balls.Add(ball);
BuildLevel(0);
ShowHud();
}
void BuildLevel(int index)
{
level = index;
string[] rows = levels[index].Split('/');
for (int row = 0; row < rows.Length; row++)
{
string line = rows[row];
float left = -(line.Length - 1) * spacingX / 2f;
for (int col = 0; col < line.Length; col++)
{
char c = line[col];
if (c == '.') continue;
Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
brick.SetHits(c - '0');
bricksLeft++;
}
}
}
public void BrickBroken(Brick brick)
{
score += brick.points;
bricksLeft--;
ShowHud();
if (Random.value < dropChance)
{
GameObject prefab = powerUps[Random.Range(0, powerUps.Length)];
Instantiate(prefab, brick.transform.position, Quaternion.identity);
}
if (bricksLeft == 0)
{
ball.ResetToPaddle();
BuildLevel((level + 1) % levels.Length);
}
}
public void BallLost(Ball lost)
{
lives--;
ShowHud();
if (lives == 0)
{
gameOverPanel.SetActive(true);
lost.gameObject.SetActive(false);
}
else lost.ResetToPaddle();
}
public void SplitBall()
{
Ball source = balls[0];
Ball left = Instantiate(source, source.transform.position, Quaternion.identity);
left.Launch(new Vector3(-0.6f, 1f, 0f));
balls.Add(left);
Ball right = Instantiate(source, source.transform.position, Quaternion.identity);
right.Launch(new Vector3(0.6f, 1f, 0f));
balls.Add(right);
}
public void PlayAgain()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void ShowHud()
{
scoreText.text = "Score: " + score;
livesText.text = "Lives: " + lives;
}
}
Semua pelajaran di Game Unity: Brick Breaker
4Power-Up
Item JatuhLatihan sendiri: Playground Unity