Menu
CoddyTech

Điểm cao nhất

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 24 trên 60.

Điểm cao nhất là kết quả tốt nhất trong tất cả các ván đã chơi, vì vậy điểm này được lưu trong PlayerPrefs và chỉ thay đổi khi một ván có kết quả cao hơn. Bàn pinball này kiểm tra khi viên bi cuối cùng rơi xuống:

void GameOver()
{
    int best = PlayerPrefs.GetInt("PinballBest", 0);
    if (score > best)
    {
        PlayerPrefs.SetInt("PinballBest", score);
        PlayerPrefs.Save();
        Debug.Log("New high score: " + score);
    }
}

Phép so sánh này giúp xác định điểm cao nhất. Nếu không có phép so sánh, một ván đạt 300 điểm sau khi đã có kỷ lục 5000 điểm sẽ lưu 300, và kỷ lục sẽ mất. Hãy so sánh với điểm cao nhất đã lưu, không phải với một giá trị bắt đầu từ 0 trong mỗi ván: một trường chưa tải dữ liệu sẽ là 0 sau mỗi lần khởi động lại, nên bất kỳ điểm số nào cũng cao hơn. score > best giữ nguyên kỷ lục cũ nếu hai điểm bằng nhau, còn score >= best sẽ coi điểm bằng nhau là điểm cao nhất mới.

Để hiển thị điểm cao nhất trong lúc chơi, hãy tải điểm đó vào một trường trong Start() rồi hiển thị trường này. Khi một ván đạt điểm cao hơn, hãy cập nhật trường, PlayerPrefs và văn bản cùng lúc để điểm trên màn hình luôn khớp với giá trị đã lưu.

challenge icon

Thử thách

Trung bình

Lưu điểm cao nhất dưới khóa BestPoints.

  1. Trong Start(), phía trên ShowBest();, viết best = PlayerPrefs.GetInt("BestPoints", 0);.
  2. Trong EndRound(), bên trong if (points > best): đặt best = points;, lưu bằng PlayerPrefs.SetInt và PlayerPrefs.Save(), sau đó gọi ShowBest(); và newBestText.SetActive(true);.

Nhấn Chơi và bơm bóng bay (giữ phím Space rồi thả ra), sau đó nhấn Dừng rồi Chơi: điểm cao nhất vẫn được lưu. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using TMPro;

public class BalloonPump : MonoBehaviour
{
    public TMP_Text pointsText;
    public TMP_Text bestText;
    public GameObject newBestText;
    public float pumpRate = 20f;

    private float air;
    private int points;
    private int best;
    private bool roundOver;

    void Start()
    {
        ShowBest();
    }

    void Update()
    {
        if (roundOver) return;

        if (Input.GetKey(KeyCode.Space))
        {
            air += pumpRate * Time.deltaTime;
            transform.localScale = Vector3.one * (1f + air / 50f);
            pointsText.text = "Points: " + Mathf.FloorToInt(air);
            if (air > 100f)
            {
                points = 0;
                pointsText.text = "Pop! Points: 0";
                GetComponent<Renderer>().enabled = false;
                roundOver = true;
                EndRound();
            }
        }
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            points = Mathf.FloorToInt(air);
            pointsText.text = "Points: " + points;
            roundOver = true;
            EndRound();
        }
    }

    void EndRound()
    {
        // Lưu kỷ lục mới tại đây
    }

    void ShowBest()
    {
        bestText.text = "Best: " + best;
    }
}

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