Menu
CoddyTech

Ba quả bóng

Bài học 17 trên 19 trong khóa học Trò chơi Unity: phá gạch của Coddy.

Vật phẩm tăng sức mạnh Multiball tách quả bóng ra: hai bản sao bay đi từ vị trí của nó. Instantiate sao chép một đối tượng trong cảnh giống như sao chép một prefab, nhưng chỉ những gì Inspector lưu mới được sao chép: các trường public và [SerializeField] như speed và paddle. Một trường private như launched bắt đầu với giá trị false, còn vận tốc bằng zero, vì vậy bạn phải phóng bản sao đi, nếu không nó sẽ nằm trên thanh đỡ.

Ball copy = Instantiate(source, source.transform.position, Quaternion.identity);
copy.Launch(new Vector3(0.2f, 1f, 0f));

GameManager lưu mọi quả bóng đang chơi trong một List<Ball> để có thể tìm chúng sau này.

challenge icon

Thử thách

Khó

Bắt một vật phẩm tăng sức mạnh Multiball để bóng tách thành ba quả.

  1. Trong GameManager, thêm List<Ball> balls = new List<Ball>(); (cùng với using System.Collections.Generic;); trong Start(), thêm ball vào danh sách trước tiên.
  2. Viết public void SplitBall(): tạo hai bản sao của balls[0] tại vị trí của nó, phóng chúng theo hướng (-0.6f, 1f, 0f) và (0.6f, 1f, 0f), rồi thêm cả hai vào balls.
  3. Trong PowerUp, vật phẩm Multiball gọi GameManager.Instance.SplitBall().

Nhấn Chơi và bắt một vật phẩm màu hồng: ba quả bóng sẽ bay. Sau đó nhấn Kiểm tra.

Tự làm thử

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;
    }
}

Tất cả bài học trong Trò chơi Unity: phá gạch

Tự luyện tập: Playground Unity