Menu
CoddyTech

Chơi lại

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

Khi con rắn chết, bảng Game Over xuất hiện cùng nút Chơi lại. Bảng nằm trong HUD và ban đầu bị ẩn. SetActive(true) sẽ hiện bảng. Con rắn biết khi nào nó chết, còn GameManager quản lý các màn hình, nên Die() gọi hàm công khai GameOver() trên GameManager.

Nút Chơi lại bắt đầu lại bằng cách tải lại cảnh. Mọi đối tượng trở về trạng thái ban đầu của cảnh: con rắn ở ô đầu tiên với hai đoạn thân, điểm số là 0, bảng bị ẩn. Nút Thử lại trong trò chơi đua xe cũng được kết nối theo cách tương tự:

void Start()
{
    retryButton.onClick.AddListener(Retry);
}

void Retry()
{
    SceneManager.LoadScene("Track1");
}

Tải cảnh theo tên sẽ gắn nút với một cảnh duy nhất. SceneManager.GetActiveScene().buildIndex là chỉ số của cảnh đang chạy, nên tải cảnh đó sẽ khởi động lại bất kỳ cảnh nào có nút này. Cảnh mới có GameManager mới. Awake() của GameManager mới đặt lại Instance, nên con rắn mới sẽ giao tiếp với GameManager mới.

challenge icon

Thử thách

Trung bình

Khi rắn chết, bảng Game Over sẽ hiện ra và nút Chơi lại bắt đầu một ván mới.

  1. Trong GameManager, thêm using UnityEngine.UI;, using UnityEngine.SceneManagement;, public GameObject gameOverPanel; và public Button playAgainButton;
  2. public void GameOver() hiển thị bảng; void PlayAgain() tải lại cảnh đang hoạt động, còn Start() thêm hàm này vào playAgainButton.onClick.
  3. Die() của Snake gọi GameManager.Instance.GameOver().

Nhấn Chơi, va vào chướng ngại vật rồi nhấn Chơi lại: ván mới sẽ bắt đầu. Sau đó nhấn Kiểm tra.

Tự làm thử

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

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

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

    void Awake()
    {
        Instance = this;
    }

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

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

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

    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