Đ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.
Thử thách
Trung bìnhLưu điểm cao nhất dưới khóa BestPoints.
- Trong
Start(), phía trênShowBest();, viếtbest = PlayerPrefs.GetInt("BestPoints", 0);. - Trong
EndRound(), bên trongif (points > best): đặtbest = points;, lưu bằngPlayerPrefs.SetIntvàPlayerPrefs.Save(), sau đó gọiShowBest();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ế
1Văn bản trên màn hình
Canvas và văn bảnHiển thị điểm sốĐịnh dạng sốĐồng hồ đếm ngượcÔn tập: Đồng hồ tốc độ7Điều khiển thời gian
Tạm dừng bằng timeScaleChuyển động chậmThời gian không bị co giãnÔn tập: Bullet Time2Nút bấm và màn hình
Nút bấm và onClickLambdaKết nối trong InspectorBật và tắt bảngThanh máuÔn tập: Cửa hàng nâng cấp5Lưu dữ liệu với PlayerPrefs
Lưu một sốTải với giá trị mặc địnhĐiểm cao nhấtLưu cài đặtÔn tập: Tiền xu trong ngân hàngTự luyện tập: Playground Unity