このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
一分間Unity講座、過去の記事は「一分間Unity講座まとめ」のサイトでご確認ください。
今回は、ゲームやアプロをいったん終了した後に再起動したサイ、前回終了したときのデータから再開したい、こんな時に役に立つ機能のご紹介です。
Unityのデータの保存は、PlayerPrefsクラスが持つ、SetInt()、SetFloat()、SetString() メソッドを使用します。また保存したデータを呼び出す際には、同じくPlayerPrefsクラスが持つ、GetInt()、GetFloat()、GetString() メソッドを使用します。
下の動画は「ファイブボックス 一分間Unity講座 振り子運動をしながら弾幕を撃ち続ける方法」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
1、素材の準備
■ UI Text
事前にステージ上に検証用で使用する UI の Text を用意します。
配置したTextは「ScoreText」などの適当な名前を指定しておきます。
今後の展開を見据え、下の図のように高さを大きめにとっておきます。
文字の大きさ、色などは任意で調整してください。

■ スクリプトファイル
続いて作成したTextを更新するためのスクリプトファイルを1つ用意し、Hierarchy上のオブジェクトにアタッチします。
サンプルでは「DataSave」という名前で保存し、MainCameraにアタッチしています。

用意したスクリプトファイルをダブルクリックで立ち上げ、以下のコードを記述します。
using UnityEngine;
using UnityEngine.UI; //NameSpaceにUIを使用する宣言
public class DataSave : MonoBehaviour
{
Text scoreText; //Text型の変数を宣言
int score = 0; //int型の変数を宣言、初期値を0に指定
void Start()
{
//ScoreText を探し、Textコンポーネントを取得
scoreText =GameObject.Find("ScoreText").GetComponent<Text>();
//scoreTextのtextプロパティを更新
scoreText.text = "Score:" + score;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.S)) //Sキーを押したとき
{
score += Random.Range(1, 100); //1~100の乱数をscoreに加算
//scoreTextのtextプロパティを更新
scoreText.text = "Score:" + score;
}
}
}
この段階でPlayするとスコアが0から開始され、Sキーを押すたびにスコアが加算されて表示するのがわかると思います。
一旦修正して再度プレイしても、当然スコアが0に戻っています。

2、データの保存
PlayerPrefs は Unity における簡易的なローカルストレージのシステムで、小規模なデータ(例えば設定やスコアなど)を保存するのに適しています。 保存するデータの型に応じ整数型はSetInt()、小数型はSetFloat()、文字列型はSetString() を使用します。
関数 | 説明 |
PlayerPrefs.SetInt(string key, int value); | 整数型の値を保存 key: 保存する値の識別子となる文字列 value: 保存する整数値 |
PlayerPrefs.SetFloat(string key, float value) | 小数型の値を保存 key: 保存する値の識別子となる文字列 value: 保存する小数値 |
PlayerPrefs.SetString(string key, string value) | 文字列型の値を保存key: 保存する値の識別子となる文字列 value: 保存する文字列の値 |
通常は保存ボタンや、終了ボタンを用意し、それが押されたタイミングで保存しますが、サンプルではSキーが押されたタイミングで毎回保存をかけます。
作成済みの Update()関数を以下のように修正します。
void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
score += Random.Range(1, 100);
scoreText.text = "Score:" + score;
PlayerPrefs.SetInt("Score", score); //scoreをキー:Scoreに保存
}
}
3、データの呼び出し
保存したデータを呼び出すには、データの型に応じ整数型はGetInt()、小数型はGetFloat()、文字列型はGetString() を使用します。 第一引数にPlayerPrefs.SetInt()などで保存した key を指定、第二引数に key がなかった時に代わりに呼び出す値を指定します。
関数 | 説明 |
PlayerPrefs.GetInt(string key, int defaultvalue); | 整数型の値を取得 key: 呼び出したいキーとなる名前 defaultvalue: keyがなかった時の整数値 |
PlayerPrefs.GetFloat(string key, float defaultvalue) | 小数型の値を取得 key: 呼び出したいキーとなる名前 defaultvalue: keyがなかった時の小数値 |
PlayerPrefs.GetString(string key, string defaultvalue) | 文字列型の値を取得 key: 呼び出したいキーとなる名前 defaultvalue: keyがなかった時の文字列 |
今回のサンプルでは、ゲーム開始時(Start関数)に保存した"Score" のデータを呼び出して、変数:score に代入します。
void Start()
{
//Key:Score を呼び出し変数:score に代入、Scoreがなければ0を代入
score = PlayerPrefs.GetInt("Score", 0);
scoreText =GameObject.Find("ScoreText").GetComponent<Text>();
scoreText.text = "Score:" + score;
}
これで毎回ゲーム開始時に、前回終了したときのscoreを引き継ぐことができるようになっています。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
Comments