ハイスコア
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 24/60。
ハイスコアはプレイしたすべてのゲームの中で最も良い結果なので、PlayerPrefs に保存され、ゲームで記録を更新したときだけ変わります。このピンボール台では、最後のボールが排出されたときに確認します。
void GameOver()
{
int best = PlayerPrefs.GetInt("PinballBest", 0);
if (score > best)
{
PlayerPrefs.SetInt("PinballBest", score);
PlayerPrefs.Save();
Debug.Log("New high score: " + score);
}
}ハイスコアになるかどうかを決めるのは、この比較です。この比較がなければ、最高記録が 5000 のときに 300 を出したゲームでも 300 が保存され、記録が失われてしまいます。保存済みの最高記録と比較しましょう。毎回のゲーム開始時に 0 から始まる値と比較してはいけません。何も読み込んでいないフィールドは再起動のたびに 0 になるため、どんなスコアでもそれを上回ってしまいます。score > best なら同点のときに古い記録が残りますが、score >= best では同点でも新しいハイスコアとして扱われます。
プレイ中にハイスコアを表示するには、Start() で値をフィールドに読み込み、そのフィールドの値を表示します。ゲームで記録を更新したときは、画面に表示される値と保存された値が食い違わないよう、フィールド、PlayerPrefs、テキストをまとめて更新しましょう。
チャレンジ
中級最高スコアをキー BestPoints で保存します。
Start()内で、ShowBest();の上にbest = PlayerPrefs.GetInt("BestPoints", 0);と書きます。EndRound()内のif (points > best)の中で、best = points;を設定し、PlayerPrefs.SetIntとPlayerPrefs.Save()で保存してから、ShowBest();とnewBestText.SetActive(true);を呼び出します。
「プレイ」を押して風船を膨らませ(Space キーを押し続けてから離し)、次に「停止」して「プレイ」します。最高スコアは保持されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class BalloonPump : MonoBehaviour
{
public TMP_Text pointsText;
public TMP_Text bestText;
public GameObject newBestText;
public float pumpRate = 20f;
private float air;
private int points;
private int best;
private bool roundOver;
void Start()
{
ShowBest();
}
void Update()
{
if (roundOver) return;
if (Input.GetKey(KeyCode.Space))
{
air += pumpRate * Time.deltaTime;
transform.localScale = Vector3.one * (1f + air / 50f);
pointsText.text = "Points: " + Mathf.FloorToInt(air);
if (air > 100f)
{
points = 0;
pointsText.text = "Pop! Points: 0";
GetComponent<Renderer>().enabled = false;
roundOver = true;
EndRound();
}
}
else if (Input.GetKeyUp(KeyCode.Space))
{
points = Mathf.FloorToInt(air);
pointsText.text = "Points: " + points;
roundOver = true;
EndRound();
}
}
void EndRound()
{
// ここで新記録を保存する
}
void ShowBest()
{
bestText.text = "Best: " + best;
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド