Banyak Bola
Pelajaran 15 dari 16 dalam kursus Game Unity: Brick Breaker di Coddy.
Power-up Multiball membagi bola: dua salinan meluncur dari tempat bola berada. Instantiate menyalin object adegan seperti menyalin prefab, tetapi hanya yang akan disimpan oleh Inspector yang ikut tersalin: field publik dan field [SerializeField] seperti speed dan paddle. Field privat seperti launched dimulai dengan nilai default-nya, false, dan velocity Rigidbody dimulai dari nol. Jadi, salinan harus diberi tahu apa yang harus dilakukan, atau salinan itu akan ikut menempel pada paddle.
Saat beberapa bola sedang dimainkan, GameManager menyimpannya dalam List<Ball>, dan bola yang hilang hanya mengurangi satu nyawa jika bola itu adalah bola terakhir. Slime yang membelah bekerja dengan cara yang sama:
List<Slime> slimes = new List<Slime>();
public void Split(Slime slime)
{
Slime half = Instantiate(slime, slime.transform.position, Quaternion.identity);
half.Hop(Vector3.left); // field privat milik salinan dimulai dari keadaan awal: beri tahu apa yang harus dilakukannya
slimes.Add(half);
}
public void SlimeDied(Slime slime)
{
slimes.Remove(slime);
Destroy(slime.gameObject);
if (slimes.Count == 0) Debug.Log("Room cleared");
}Bola pertama dalam list bisa saja merupakan salinan, karena bola asli bisa hilang sementara salinannya terus melaju. Jadi, kode yang membutuhkan bola menggunakan list, bukan field Ball dari adegan.
Tantangan
Sulit- Di
GameManager, tambahkanusing System.Collections.Generic;danList<Ball> balls = new List<Ball>();.Start()terlebih dahulu menambahkanballke dalamnya. - Tulis
public void SplitBall(): buat dua salinanballs[0]di posisinya, luncurkan satu ke arahnew Vector3(-0.6f, 1f, 0f)dan satu lagi ke arahnew Vector3(0.6f, 1f, 0f), lalu tambahkan keduanya ke list. - Ubah
BallLost: selama ada lebih dari satu bola di list, bola yang hilang dihapus dari list dan dihancurkan, tanpa mengurangi nyawa. Saat level selesai, kembalikanballs[0]ke paddle, bukanball. - Di
PowerUp, Multiball memanggilGameManager.Instance.SplitBall()saat tertangkap.
Tekan Play, tangkap power-up merah muda, lalu tekan Check.
Coba sendiri
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;
void Awake()
{
Instance = this;
}
void Start()
{
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 PlayAgain()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void ShowHud()
{
scoreText.text = "Score: " + score;
livesText.text = "Lives: " + lives;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.