Menu
CoddyTech

再玩一次

Coddy Unity 3D 贪吃蛇游戏 课程的第 12 课,共 14 课。

蛇死亡时,会显示一个“游戏结束”面板,其中有一个“再玩一次”按钮。这个面板位于 HUD 中,初始时处于隐藏状态,SetActive(true) 会显示它。蛇知道自己何时死亡,而 GameManager 负责管理界面,因此 Die() 会调用 GameManager 上的公共 GameOver() 函数。

点击“再玩一次”会重新加载场景,从头开始。场景中的所有对象都会恢复到场景设定的状态:蛇位于第一个格子上,包含两个节段;分数为 0;面板处于隐藏状态。竞速游戏中的“重试”按钮也是这样连接的:

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

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

按名称加载会将按钮绑定到一个场景。SceneManager.GetActiveScene().buildIndex 表示当前正在运行的场景,因此加载这个场景就会重新启动按钮所在的场景。新场景会创建一个新的 GameManager,它的 Awake() 会再次设置 Instance,因此新的蛇会与新的 GameManager 通信。

challenge icon

挑战

中等

死亡后会显示“游戏结束”面板,点击“再玩一次”会开始新游戏。

  1. 在 GameManager 中,添加 using UnityEngine.UI;、using UnityEngine.SceneManagement;、public GameObject gameOverPanel; 和 public Button playAgainButton;
  2. public void GameOver() 会显示面板;void PlayAgain() 会重新加载当前场景,而 Start() 会将其添加到 playAgainButton.onClick。
  3. Snake 的 Die() 会调用 GameManager.Instance.GameOver()。

点击运行,撞上障碍后点击再玩一次:新游戏就会开始。然后点击检查。

亲手试试

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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

Unity 3D 贪吃蛇游戏中的所有课

自己练习: Unity 在线编辑器