デフォルト値で読み込む
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 23/56。
一度も保存されていないキーを読み取ると 0 が返されますが、値によっては 0 では始めにくいことがあります。レースゲームでは、プレイヤーがレースに参加するコンピューター制御のライバルの数を選べます。新しいプレイヤーは 3 人を相手にレースをするのがよいでしょう。すべての Get は 2 番目の引数としてデフォルト値を取り、キーが存在しない場合にその値を返します。
int rivals = PlayerPrefs.GetInt("Rivals", 3);
string driver = PlayerPrefs.GetString("Driver", "Rookie");プレイヤーが一人で練習するためにライバルの数として 0 を保存すると、GetInt("Rivals", 3) は 0 を返します。デフォルト値が使われるのは、キーが存在しない場合だけです。だから、デフォルト値を設定するために if (rivals == 0) rivals = 3; とするのは間違いです。保存された 0 と何も保存されていない状態を区別できず、練習レースのたびにライバルを 3 人に戻してしまいます。
PlayerPrefs.HasKey(key) は、値に関係なくキーが一度でも保存されたことがあるかを答えるので、初回のゲームか、それ以降のゲームかを判別できます。このゲームでは、新しいドライバーに挨拶します。
void Start()
{
if (!PlayerPrefs.HasKey("Driver"))
{
Debug.Log("First race! Pick a name in the garage.");
}
string driver = PlayerPrefs.GetString("Driver", "Rookie");
Debug.Log("Driver: " + driver);
}キーを保存するコードを実行する前に HasKey を呼び出してください。最初に保存された後は、PlayerPrefs.DeleteKey でキーが削除されるまで、true を返します。
チャレンジ
中級アーケードゲーム機はプレイヤーのクレジットをキー Credits の下に保持します。Spaceキーで1クレジットを使ってゲームをプレイし、残りのクレジットは各ゲームの後に保存されます。新規プレイヤーの処理はまだ実装されていません。
- 保存データが何もないプレイヤーは、無料クレジットを5つ持った状態で開始します。すべてのクレジットを使い切ったプレイヤーの保存値は0なので、5ではなく0で開始します。
welcomeTextオブジェクト(ようこそ!無料クレジットが5つあります)は、Creditsが保存されていないプレイヤーにだけ表示されます。それ以外のプレイヤーには表示されません。
Play を押してゲームをプレイし、次に Stop を押してから、もう一度 Play を押します。ウェルカムメッセージが消えます。その後、Check を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class ArcadeCredits : MonoBehaviour
{
public TMP_Text creditsText;
public GameObject welcomeText;
private int credits;
void Start()
{
credits = PlayerPrefs.GetInt("Credits");
welcomeText.SetActive(false);
ShowCredits();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && credits > 0)
{
credits--;
PlayerPrefs.SetInt("Credits", credits);
PlayerPrefs.Save();
ShowCredits();
}
}
void ShowCredits()
{
creditsText.text = "Credits: " + credits;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。