重新开始关卡
本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 18 课,共 60 课。
重置关卡最快的方法是重新加载它。SceneManager.GetActiveScene() 会返回当前打开的场景,而它的 name(或 buildIndex)就是 LoadScene 所需的参数。游戏结束面板上的这个“重启”按钮会调用:
public void Restart()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}Unity 会销毁当前打开的场景,并根据场景文件重新创建场景。场景中的每个对象都会回到场景设定的位置,包括被玩家撞倒的板条箱;每个字段都会恢复为 Inspector 中的值,Awake 和 Start 也会再次运行。你不必逐个编写代码来还原对象。由于按钮获取的是活动场景,而不是像 "Level3" 这样的名称,因此同一个脚本可以重启它所在的任何关卡。
static 字段不属于场景,而是属于类,因此重新加载场景不会改变它的值。private static float bestTime; 会在重启后保留最佳时间,而普通的 private float time; 会随着新场景从 0 重新开始。GameManager.Instance 也是静态的:重新加载场景后,它仍指向已销毁的 GameManager,直到新 GameManager 的 Awake 设置它。
挑战
简单玩家掉落时,应重新开始当前关卡,并记录掉落次数。
- 添加
using UnityEngine.SceneManagement;,并将计数变量改为private static int falls;,这样重新加载后计数也会保留。 - 在
Update()中,当player.position.y < fallY时,执行falls++;,并加载SceneManager.GetActiveScene().name。
按“开始”,然后在两个关卡中都从边缘走下去:先显示 Falls: 1,然后显示 Falls: 2。接着按“检查”。
亲手试试
using UnityEngine;
using TMPro;
public class LevelRestart : MonoBehaviour
{
public Transform player;
public TMP_Text fallsText;
public float fallY = -3f;
private int falls;
void Start()
{
fallsText.text = "Falls: " + falls;
}
void Update()
{
// 低于 fallY 时:记录一次掉落,并重新开始玩家所在的关卡
}
}
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器