Menu
CoddyTech

重新开始关卡

本课属于 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 设置它。

challenge icon

挑战

简单

玩家掉落时,应重新开始当前关卡,并记录掉落次数。

  1. 添加 using UnityEngine.SceneManagement;,并将计数变量改为 private static int falls;,这样重新加载后计数也会保留。
  2. 在 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 在线编辑器