数値を保存する
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フィールドを使っても回避できません。ゲームが実行中の間だけ有効であり、ゲームを終了すればそれも終わります。
チャレンジ
中級ジャンプ回数を、ゲーム間でも保存される生涯累計にしましょう。
Update()内で、jumps++;の後に、PlayerPrefs.SetInt("TotalJumps", jumps);とPlayerPrefs.Save();を追加します。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プレイグラウンド