Menu
CoddyTech

Phá vỡ

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

Những viên gạch không có Rigidbody, nhưng quả bóng thì có, và Unity gửi OnCollisionEnter đến cả hai đối tượng trong một vụ va chạm. Vì vậy, viên gạch có thể tự nhận biết cú va chạm. Trong script của viên gạch, gameObject là viên gạch, còn collision.gameObject là vật đã va vào nó.

Điểm số thuộc về GameManager, còn các viên gạch là bản sao của một prefab. Prefab là một tài nguyên nằm bên ngoài cảnh, nên các trường của nó không thể trỏ đến GameManager trong cảnh thông qua Inspector. GameManager gán chính nó cho GameManager.Instance dạng static trong Awake(), vì vậy script nào cũng có thể truy cập nó, kể cả các bản sao của prefab.

Một chiếc bình vỡ khi người chơi chạy va vào nó:

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Player")) Shatter();
}

public void Shatter()
{
    Destroy(gameObject);
}

Destroy(gameObject) xóa chiếc bình. Destroy(collision.gameObject) sẽ xóa người chơi, còn Destroy(this) chỉ xóa script, để lại chiếc bình nguyên vẹn. Đặt thao tác phá vỡ trong một phương thức public riêng giúp đoạn code khác, chẳng hạn như bom hoặc vật phẩm tăng sức mạnh, cũng có thể phá vỡ chiếc bình.

challenge icon

Thử thách

Trung bình

Quả bóng phá vỡ các viên gạch và ghi điểm tương ứng.

  1. Trong GameManager, thêm int score; và public void BrickBroken(Brick brick), hàm này cộng brick.points vào điểm số.
  2. Trong Brick, viết public void Hit(): GameManager.Instance.BrickBroken(this);, sau đó gọi Destroy(gameObject);
  3. Trong OnCollisionEnter của Brick, gọi Hit() khi đối tượng có thẻ Ball.

Nhấn Chơi rồi phóng bóng: mỗi viên gạch bị bóng chạm vào sẽ biến mất. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Brick : MonoBehaviour
{
    public int points = 10;

    // Tiếp theo: quả bóng phá vỡ một viên gạch và ghi số điểm của viên gạch đó.
}

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

Tự luyện tập: Playground Unity