最高記録を残す
CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 60/64。
Arena Survivorが完成しました。2種類の抽象的なEnemy、すべての攻撃に対応するIDamageable、ScriptableObjectからのウェーブ、インターフェースを通じたアイテムの取得、イベントを受け取るだけのHUD、そして最後に、ベストプレイを保存するJSONがあります。
チャレンジ
中級最高記録をbest.jsonに保存します。
GameManager.csで、public intのwaveとkillsを持つ[System.Serializable]クラスBestRunを追加します。- ファイルが存在する場合、
StartでJsonUtilityを使ってApplication.persistentDataPath内のbest.jsonから読み込みます。 - ゲームオーバー時、より高いウェーブ、または同じウェーブでキル数が多い場合に最高記録となり、保存されます。
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);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Unityのゲームアーキテクチャのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド