数値を保存する
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 22/56。
ゲームを開始すると、すべてのフィールドはデフォルト値から始まります。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フィールドを使っても回避できません。ゲームの実行中だけ保持され、終了すればそれも失われます。
チャレンジ
中級Hopper の JumpCounter は画面上でジャンプ回数を数えますが、その回数は通常のフィールドなので、新しいゲームを始めるたびに Jumps: 0 に戻ります。ゲームをまたいで引き継がれる累計回数にしましょう。
- ジャンプするたびに、
PlayerPrefs.SetIntを使ってキーTotalJumpsの下にjumpsを保存し、PlayerPrefs.Save()でディスクに書き込みます。 Start()で、テキストに表示する前に保存された累計回数をjumpsに読み込みます。
Play を押して数回ジャンプし、次に Stop を押してからもう一度 Play を押します。回数が引き継がれます。その後、Check を押します。
自分で試してみよう
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;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。