夜晚的终结
本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 60 课,共 60 课。
最后一个挑战将完成整个游戏:一个带有状态的管理器、一个能让时间停止的暂停功能、两个结局,以及一个能将时间缩放恢复原状的重启功能。
挑战
困难添加暂停、两种结束状态和重新开始功能。
pauseButton只在 Playing 和 Paused 之间切换:Paused 会将Time.timeScale设为 0 并显示pausePanel,Playing 则撤销这两项设置。- 剩余时间为 0 秒时,夜晚结束且状态为 Won。无论状态是 Won 还是 Lost:时间缩放设为 0,
endPanel显示,并在endText中显示You survived the night!或The bats got you。 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);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器