保存最佳战绩
本课属于 Coddy Unity 学习旅程的“Unity 游戏架构”单元。第 60 课,共 64 课。
Arena Survivor 已完成:一个抽象的 Enemy,包含两种类型;每次受击都使用 IDamageable;波次来自 ScriptableObject;拾取物通过接口实现;HUD 只负责监听;最后,还会将最佳成绩保存为 JSON。
挑战
中等将最佳成绩保存在 best.json 中。
- 在
GameManager.cs中,添加一个带有[System.Serializable]的BestRun类,其中包含公共整数wave和kills。 - 如果文件存在,
Start会使用JsonUtility从Application.persistentDataPath中的best.json加载数据。 - 游戏结束时,如果波次更高,或者波次相同但击杀数更多,就会成为最佳成绩并保存;
bestText显示Best: wave 3, 12 kills。
按下 Play,然后失败两次:最佳成绩会保留。接着点击 Check。
亲手试试
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private Hero hero;
[SerializeField] private WaveSpawner spawner;
[SerializeField] private GameObject gameOverPanel;
[SerializeField] private TMP_Text resultText;
[SerializeField] private TMP_Text bestText;
[SerializeField] private Button restartButton;
private int kills;
void OnEnable()
{
hero.Died += GameOver;
Enemy.Died += CountKill;
}
void OnDisable()
{
hero.Died -= GameOver;
Enemy.Died -= CountKill;
}
void Start()
{
gameOverPanel.SetActive(false);
restartButton.onClick.AddListener(Restart);
}
void CountKill(Enemy enemy)
{
kills++;
}
void GameOver()
{
Time.timeScale = 0f;
int wave = spawner.Wave;
resultText.text = "Wave " + wave + ", " + kills + " kills";
gameOverPanel.SetActive(true);
}
void Restart()
{
Time.timeScale = 1f;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Unity 游戏架构中的所有课
自己练习: Unity 在线编辑器