Unity 2D: làm hệ thống thu thập đồng xu và hiển thị điểm số

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Đồng xu và điểm số là "gia vị" quen thuộc của game 2D: chúng tạo mục tiêu và cảm giác tiến bộ cho người chơi. Bài này hướng dẫn bạn làm đồng xu biến mất khi nhân vật chạm vào, cộng điểm và hiển thị lên màn hình bằng Unity.

Kiến thức nền: Collider và Trigger

Trong Unity, va chạm vật lý do Collider xử lý. Collider thường (solid) chặn vật thể khác đi xuyên qua. Collider đánh dấu Is Trigger thì không chặn, mà chỉ gửi sự kiện khi có vật đi vào. Đồng xu là ví dụ điển hình của trigger: nhân vật đi xuyên qua nhưng game vẫn nhận biết được. Điều kiện để sự kiện kích hoạt là ít nhất một trong hai vật có Rigidbody2D, thường là nhân vật.

Bước 1: Tạo đồng xu

  1. Tạo một Sprite hình tròn (2D Object > Sprites > Circle), đổi tên Coin, tô màu vàng.
  2. Thêm component Circle Collider 2D và tích chọn Is Trigger.
  3. Gán Tag Coin (tạo mới trong ô Tag của Inspector nếu chưa có).
  4. Kéo đồng xu từ Hierarchy vào thư mục Project để tạo Prefab, sau đó có thể đặt nhiều bản sao khắp màn chơi.

Hãy chắc chắn đối tượng nhân vật có Tag Player và có Rigidbody2D cùng Collider2D.

Bước 2: Quản lý điểm số

Ta tạo một script quản lý trung tâm. Dùng mẫu singleton đơn giản để mọi script đều gọi được mà không phải tìm kiếm đối tượng.

using UnityEngine;
using TMPro;

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance { get; private set; }

    [SerializeField] private TextMeshProUGUI scoreText;

    private int score;

    void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
    }

    void Start()
    {
        UpdateUI();
    }

    public void AddScore(int amount)
    {
        score += amount;
        UpdateUI();
    }

    private void UpdateUI()
    {
        scoreText.text = "Điểm: " + score;
    }
}

Thuộc tính [SerializeField] cho phép gán đối tượng trong Inspector mà vẫn giữ biến ở chế độ private. Nếu Unity chưa có font tiếng Việt đầy đủ, bạn nên tạo Font Asset TextMeshPro từ một font hỗ trợ tiếng Việt để các chữ có dấu hiển thị đúng.

Bước 3: Dựng giao diện điểm số

  1. Chuột phải Hierarchy chọn UI > Text - TextMeshPro. Unity sẽ tạo Canvas, EventSystem và đối tượng chữ; nếu hiện hộp thoại nhập TMP Essentials thì bấm Import.
  2. Đặt chữ ở góc trên bên trái bằng cách chỉnh Anchor.
  3. Tạo một GameObject trống tên GameManager, gắn script ScoreManager và kéo đối tượng chữ vào ô Score Text.

Bước 4: Script đồng xu

using UnityEngine;

public class Coin : MonoBehaviour
{
    [SerializeField] private int value = 1;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (!other.CompareTag("Player")) return;

        ScoreManager.Instance.AddScore(value);
        Destroy(gameObject);
    }
}

Gắn script Coin vào prefab đồng xu. Hàm OnTriggerEnter2D được Unity gọi khi một collider khác đi vào vùng trigger. Dùng CompareTag hiệu quả và an toàn hơn so sánh chuỗi với other.tag. Nhấn Play, điều khiển nhân vật chạm vào đồng xu: nó biến mất và điểm tăng lên.

Bước 5: Thêm cảm giác "sướng tay"

  • Hiệu ứng xoay hoặc nhấp nhô: thêm vào Update đoạn transform.Rotate(0, 180 * Time.deltaTime, 0) hoặc dịch lên xuống nhẹ theo hàm sin.
  • Âm thanh: phát tiếng "ting" bằng AudioSource.PlayClipAtPoint trước khi hủy đồng xu.
  • Hạt (particle): tạo hiệu ứng lấp lánh nhỏ tại vị trí đồng xu.
  • Đồng xu có giá trị khác nhau bằng cách chỉnh biến value trong Inspector của từng prefab biến thể.

Lỗi thường gặp

  • Chạm mà không có phản ứng: kiểm tra Is Trigger đã tích, hàm đúng tên OnTriggerEnter2D (có số 2D), nhân vật có Rigidbody2D và đúng Tag.
  • Lỗi NullReferenceException: thường do chưa kéo đối tượng chữ vào ScoreManager hoặc chưa có GameManager trong scene.
  • Điểm không reset khi tải lại scene: biến singleton bị hủy theo scene, nên điểm sẽ về 0 theo thiết kế này. Nếu muốn giữ điểm giữa các scene, cần dùng DontDestroyOnLoad hoặc lưu dữ liệu riêng.

Kết luận

Bạn vừa gặp ba khái niệm dùng đi dùng lại: trigger collider, giao tiếp giữa các script và cập nhật giao diện. Từ đây có thể mở rộng thành hệ thống mạng sống, kho vật phẩm hay nhiệm vụ.

Nếu muốn làm game hoàn chỉnh theo lộ trình, hãy tham khảo các khóa học Unity tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment