Menu
CoddyTech

保存最佳战绩

本课属于 Coddy Unity 学习旅程的“Unity 游戏架构”单元。第 60 课,共 64 课。

Arena Survivor 已完成:一个抽象的 Enemy,包含两种类型;每次受击都使用 IDamageable;波次来自 ScriptableObject;拾取物通过接口实现;HUD 只负责监听;最后,还会将最佳成绩保存为 JSON。

challenge icon

挑战

中等

将最佳成绩保存在 best.json 中。

  1. 在 GameManager.cs 中,添加一个带有 [System.Serializable] 的 BestRun 类,其中包含公共整数 wave 和 kills。
  2. 如果文件存在,Start 会使用 JsonUtility 从 Application.persistentDataPath 中的 best.json 加载数据。
  3. 游戏结束时,如果波次更高,或者波次相同但击杀数更多,就会成为最佳成绩并保存;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);
    }
}
quiz icon自我测试

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

Unity 游戏架构中的所有课

自己练习: Unity 在线编辑器