Menu
CoddyTech

Tùy chỉnh theo ý bạn

Bài học 14 trên 14 trong khóa học Game Unity: rắn 3D của Coddy.

Còn một tính năng nữa: lưu điểm cao nhất ngay cả khi bạn đóng trò chơi. PlayerPrefs sẽ lưu điểm này: đọc điểm với giá trị mặc định trong Start(), rồi lưu khi trò chơi kết thúc nếu điểm số vượt qua điểm cao nhất. Trong trò chơi đua xe, điểm vòng đua tốt nhất được tính theo cách ngược lại, vì thời gian càng thấp càng tốt:

if (lapTime < bestLap)
{
    bestLap = lapTime;
    PlayerPrefs.SetFloat("BestLap", bestLap);
}

Sau đó, bạn có thể tùy chỉnh trò chơi theo ý mình. Các giá trị trong Snake quyết định cảm giác chơi: đặt tick thành 0.25 để bắt đầu chậm rãi hoặc 0.1 để bắt đầu nhanh, đặt speedUp thành 0.01 để rắn tăng tốc sớm hơn, và đặt minTick thành 0.05 để đoạn cuối trò chơi trở nên gay cấn. Trong trình chỉnh sửa này, bạn chỉ có thể xem Inspector, còn cảnh của khóa học giữ nguyên ba trường này theo các giá trị trong code. Vì vậy, hãy thay đổi chúng ở nơi khai báo rồi nhấn Play. Trong dự án Unity của riêng mình, bạn hãy thay đổi chúng trên thành phần Snake trong Inspector: giá trị mặc định mới trong code sẽ không cập nhật thành phần đã có trong một cảnh.

challenge icon

Thử thách

Khó

Giữ điểm cao nhất qua các ván chơi, rồi tinh chỉnh trò chơi.

  1. Trong GameManager, thêm public TMP_Text bestText; và private int best;
  2. Trong Start(), dùng best = PlayerPrefs.GetInt("BestScore", 0); rồi hiển thị "Best: " + best.
  3. Trong GameOver(), khi điểm số cao hơn điểm cao nhất, hãy cập nhật best, lưu điểm đó với khóa BestScore rồi hiển thị.
  4. Tinh chỉnh tick, speedUp và minTick tại nơi khai báo chúng trong Snake.

Nhấn Chơi, lập điểm cao nhất rồi chơi lại: Best vẫn nằm ở góc trên bên phải. Sau đó nhấn Kiểm tra.

Tự làm thử

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    public GameObject gameOverPanel;
    public Button playAgainButton;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        playAgainButton.onClick.AddListener(PlayAgain);
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    public void GameOver()
    {
        gameOverPanel.SetActive(true);
    }

    void PlayAgain()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Game Unity: rắn 3D

Tự luyện tập: Playground Unity