Menu
CoddyTech

数値を保存する

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 22/60。

ゲームが始まると、すべてのフィールドはデフォルト値から始まります。40個の宝石を集めたプレイヤーがゲームを終了して翌日に戻ってくると、ゲームを終了するとゲーム内のすべてが終わるため、宝石の数は0になっています。PlayerPrefsは、ゲーム間でプレイヤーのデバイスに小さな値を保存します。それぞれの値は、SetInt、SetFloat、またはSetStringを使って、選択した文字列であるキーに対応付けて保存されます。

PlayerPrefs.SetString("PlayerName", "Robin");
PlayerPrefs.SetInt("LevelReached", 4);
PlayerPrefs.SetFloat("HoursPlayed", 2.5f);
PlayerPrefs.Save();

値を読み戻すには、同じキーを使って同じ型のGetを呼び出します。一度も保存されていないキーを読み込むと、0、0、または空の文字列が返されます。そのため、プレイヤーの初回プレイでは、このあいさつに空の名前とレベル0が表示されます。

void Start()
{
    string player = PlayerPrefs.GetString("PlayerName");
    int level = PlayerPrefs.GetInt("LevelReached");
    Debug.Log(player + " is on level " + level);
}

キーでは大文字と小文字が区別されます。GetInt("levelreached")は一度も保存されていないキーを読み込むため、0を返します。1つのキーに保存できる型は1つなので、保存時に使ったSetに対応するGetで読み込んでください。値が変わったときに保存し、ゲーム終了時だけに保存するのは避けましょう。Unityはゲームが正常に終了するとPlayerPrefsをディスクに書き込み、PlayerPrefs.Save()を呼ぶとすぐに書き込むため、クラッシュしても失われません。staticフィールドを使っても回避できません。ゲームが実行中の間だけ有効であり、ゲームを終了すればそれも終わります。

challenge icon

チャレンジ

中級

ジャンプ回数を、ゲーム間でも保存される生涯累計にしましょう。

  1. Update()内で、jumps++;の後に、PlayerPrefs.SetInt("TotalJumps", jumps);とPlayerPrefs.Save();を追加します。
  2. Start()内で、ShowJumps();の上に、次のコードを追加して読み込みます:jumps = PlayerPrefs.GetInt("TotalJumps");。

「プレイ」を押してジャンプし、次に「停止」を押してから、もう一度「プレイ」を押すと、カウントが引き継がれます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;
using TMPro;

public class JumpCounter : MonoBehaviour
{
    public TMP_Text jumpsText;
    public float hop = 5f;
    private Rigidbody rb;
    private int jumps;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        ShowJumps();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.linearVelocity = Vector3.up * hop;
            jumps++;
            ShowJumps();
        }
    }

    void ShowJumps()
    {
        jumpsText.text = "Jumps: " + jumps;
    }
}

本格的なゲームを作るのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド