Menu
CoddyTech

ハイスコア

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、テキストをまとめて更新しましょう。

challenge icon

チャレンジ

中級

最高スコアをキー BestPoints で保存します。

  1. Start() 内で、ShowBest(); の上に best = PlayerPrefs.GetInt("BestPoints", 0); と書きます。
  2. 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プレイグラウンド