Menu
CoddyTech

Đồng hồ đếm ngược

Thuộc phần Xây dựng trò chơi thực tế trong hành trình Unity của Coddy. Bài học 4 trên 60.

Đồng hồ đếm ngược lưu thời gian còn lại dưới dạng float và trừ Time.deltaTime khỏi giá trị đó ở mỗi khung hình. Khung hình cuối hiếm khi dừng đúng ở 0, vì vậy Mathf.Max giữ giá trị ở đó, và hành động kết thúc chỉ được diễn ra một lần. Cầu chì này cho người chơi 5 giây để gỡ bom:

public TMP_Text fuseText;
public float fuse = 5f;
private bool exploded;

void Update()
{
    if (exploded)
    {
        return;
    }

    fuse = Mathf.Max(fuse - Time.deltaTime, 0f);
    fuseText.text = "Fuse: " + Mathf.CeilToInt(fuse);

    if (fuse == 0f)
    {
        exploded = true;
        fuseText.text = "BOOM";
        fuseText.color = Color.red;
    }
}

Mathf.CeilToInt làm tròn lên, đúng như cách đồng hồ đếm ngược hiển thị: 5 trong suốt giây đầu tiên (4.99 được làm tròn lên thành 5), 1 trong giây cuối cùng và 0 chỉ khi hết giờ. (int)fuse sẽ cắt 4.99 xuống thành 4 và hiển thị 0 trong suốt giây cuối cùng khi bom vẫn đang tích tắc; Mathf.RoundToInt sẽ hiển thị 0 trong nửa giây cuối. Đồng hồ đếm ngược dài hơn, hiển thị bằng phút và giây, cũng tuân theo quy tắc tương tự: trước tiên làm tròn thời gian lên đến số giây nguyên, rồi định dạng các giây đó.

return sớm giữ BOOM trên màn hình: nếu không có nó, khung hình tiếp theo sẽ ghi đè bằng Fuse: 0. Văn bản cũng có màu, và fuseText.color = Color.red sẽ chuyển văn bản thành màu đỏ.

challenge icon

Thử thách

Dễ

Hãy để đồng hồ tính tiền đỗ xe đếm ngược thời gian đã trả tiền.

  1. Trong Update(), trừ Time.deltaTime khỏi timeLeft, không để giá trị xuống dưới 0, rồi hiển thị Mathf.CeilToInt(timeLeft) dưới dạng phút và giây: 1:15.
  2. Phím cách cộng thêm 30 giây, tối đa là maxTime (2:00).
  3. Khi thời gian về 0, hiển thị EXPIRED bằng Color.red. Bắt đầu Update() bằng if (timeLeft == 0f) return; để đồng hồ giữ nguyên trạng thái đó.

Nhấn Chơi rồi nạp xu vào đồng hồ: thời gian dừng ở 2:00. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using TMPro;

public class ParkingMeter : MonoBehaviour
{
    public TMP_Text meterText;
    public float timeLeft = 60f;
    public float maxTime = 120f;

    void Update()
    {
        // Đếm ngược timeLeft và hiển thị theo phút, giây; nhấn Space để cộng thêm 30 giây
    }
}

Tất cả bài học trong Xây dựng trò chơi thực tế

Tự luyện tập: Playground Unity