ハイスコア
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 24/56。
ハイスコアはプレイしたすべてのゲームの中で最高の結果なので、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、テキストをまとめて更新しましょう。
チャレンジ
中級風船ポンプ:Spaceを押し続けて風船に空気を送り込み、1秒あたり20ポイントを獲得します。離すとポイントが確定します。100を超えてポンプすると風船が割れ、ポイントは0になります。ポンプ操作、風船が割れること、ポイント表示は実装済みです。ラウンドが終了すると、ラウンドのスコアがpointsに入った状態でEndRound()が1回呼び出されます。ハイスコアを追加し、キーBestPointsで保存しましょう:
Start()でハイスコアをbestに読み込みます(新しいプレイヤーの場合は0)。これにより、ShowBest()に表示されます。EndRound()で、pointsがハイスコアを上回った場合は保存して表示し、newBestTextも表示します。ハイスコアを上回らないラウンドでは何も変更しません。
Playを押して風船をいくつか膨らませ(Stop、次にPlayを押すと新しいラウンドが始まります)、その後Checkを押してください。
自分で試してみよう
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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。