Menu
CoddyTech

最高記録を残す

CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 60/64。

Arena Survivorが完成しました。2種類の抽象的なEnemy、すべての攻撃に対応するIDamageable、ScriptableObjectからのウェーブ、インターフェースを通じたアイテムの取得、イベントを受け取るだけのHUD、そして最後に、ベストプレイを保存するJSONがあります。

challenge icon

チャレンジ

中級

最高記録をbest.jsonに保存します。

  1. GameManager.csで、public intのwaveとkillsを持つ[System.Serializable]クラスBestRunを追加します。
  2. ファイルが存在する場合、StartでJsonUtilityを使ってApplication.persistentDataPath内のbest.jsonから読み込みます。
  3. ゲームオーバー時、より高いウェーブ、または同じウェーブでキル数が多い場合に最高記録となり、保存されます。bestTextにはBest: wave 3, 12 killsと表示されます。

「プレイ」を押して2回倒されても、最高記録は保持されます。その後、「確認」を押します。

自分で試してみよう

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プレイグラウンド