Menu
CoddyTech

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.

challenge icon

Tantangan

Sulit
  1. Di GameManager, tambahkan using System.Collections.Generic; dan List<Ball> balls = new List<Ball>();. Start() terlebih dahulu menambahkan ball ke dalamnya.
  2. Tulis public void SplitBall(): buat dua salinan balls[0] di posisinya, luncurkan satu ke arah new Vector3(-0.6f, 1f, 0f) dan satu lagi ke arah new Vector3(0.6f, 1f, 0f), lalu tambahkan keduanya ke list.
  3. Ubah BallLost: selama ada lebih dari satu bola di list, bola yang hilang dihapus dari list dan dihancurkan, tanpa mengurangi nyawa. Saat level selesai, kembalikan balls[0] ke paddle, bukan ball.
  4. Di PowerUp, Multiball memanggil GameManager.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;
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Brick Breaker