Menu
CoddyTech

夜晚的终结

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 60 课,共 60 课。

最后一个挑战将完成整个游戏:一个带有状态的管理器、一个能让时间停止的暂停功能、两个结局,以及一个能将时间缩放恢复原状的重启功能。

challenge icon

挑战

困难

添加暂停、两种结束状态和重新开始功能。

  1. pauseButton 只在 Playing 和 Paused 之间切换:Paused 会将 Time.timeScale 设为 0 并显示 pausePanel,Playing 则撤销这两项设置。
  2. 剩余时间为 0 秒时,夜晚结束且状态为 Won。无论状态是 Won 还是 Lost:时间缩放设为 0,endPanel 显示,并在 endText 中显示 You survived the night! 或 The bats got you。
  3. restartButton 将时间缩放设为 1,并重新加载场景。

按“开始”,暂停、失败,然后再玩一次。接着按“检查”。

亲手试试

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public enum State { Playing, Paused, Won, Lost }

    public static GameManager Instance;

    public float nightLength = 15f;
    public float spawnEvery = 2f;
    public GameObject batPrefab;
    public Transform[] spawnPoints;
    public TMP_Text dawnText;
    public Button pauseButton;
    public GameObject pausePanel;
    public GameObject endPanel;
    public TMP_Text endText;
    public Button restartButton;

    public State state;

    private float timeLeft;
    private float spawnTimer;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        state = State.Playing;
        timeLeft = nightLength;
        ShowDawn();
    }

    void Update()
    {
        if (state != State.Playing) return;

        timeLeft -= Time.deltaTime;
        spawnTimer += Time.deltaTime;
        if (spawnTimer >= spawnEvery)
        {
            spawnTimer -= spawnEvery;
            Transform point = spawnPoints[Random.Range(0, spawnPoints.Length)];
            Instantiate(batPrefab, point.position, Quaternion.identity);
        }
        ShowDawn();
    }

    public void Lose()
    {
        if (state != State.Playing) return;
        state = State.Lost;
    }

    void ShowDawn()
    {
        dawnText.text = "Dawn in " + Mathf.CeilToInt(timeLeft);
    }
}
quiz icon自我测试

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

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器