Menu
CoddyTech

Mất một quả bóng

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

Bóng lọt qua thanh đỡ sẽ bị mất. Cảnh bên dưới thanh đỡ giờ có một vùng tử thần: một đối tượng có collider hình hộp được đặt thành Is Trigger và có thẻ DeathZone. Vùng kích hoạt không chặn gì cả; nó gửi OnTriggerEnter(Collider other) khi một vật có Rigidbody đi vào. Bóng báo mất lượt cho GameManager, đối tượng quản lý số mạng và quyết định việc tiếp theo sẽ xảy ra.

Viên bi rơi xuống nước sẽ xuất hiện lại ở điểm xuất phát:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Water")) Respawn();
}

void Respawn()
{
    rb.linearVelocity = Vector3.zero;
    transform.position = spawnPoint.position;
}

Bóng cần ít thao tác hơn viên bi. Update() đã đặt bóng trên thanh đỡ ở mỗi khung hình khi launched là false, nên để đặt lại, chỉ cần xóa cờ đó và dừng bóng: khung hình tiếp theo sẽ đưa bóng trở lại, rồi phím Space sẽ phóng bóng đi lần nữa.

challenge icon

Thử thách

Trung bình

Để bóng rơi sẽ mất một mạng và đưa bóng trở lại thanh đỡ.

  1. Trong Ball, viết public void ResetToPaddle(): launched = false; và vận tốc Vector3.zero.
  2. Trong OnTriggerEnter của Ball, khi đi vào đối tượng có thẻ DeathZone, hãy gọi GameManager.Instance.BallLost(this).
  3. Trong GameManager, thêm public int lives = 3; và public void BallLost(Ball lost): giảm một mạng, sau đó gọi lost.ResetToPaddle();

Nhấn Chơi rồi để bóng rơi: bóng sẽ lại nằm trên thanh đỡ. Sau đó nhấn Kiểm tra.

Tự làm thử

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;
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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

Tự luyện tập: Playground Unity