再玩一次
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 通信。
挑战
中等死亡后会显示“游戏结束”面板,点击“再玩一次”会开始新游戏。
- 在
GameManager中,添加using UnityEngine.UI;、using UnityEngine.SceneManagement;、public GameObject gameOverPanel;和public Button playAgainButton; public void GameOver()会显示面板;void PlayAgain()会重新加载当前场景,而 Start() 会将其添加到playAgainButton.onClick。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)];
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Unity 3D 贪吃蛇游戏中的所有课
自己练习: Unity 在线编辑器