#「ステージセレクト画面を作って、前のステージをクリアしたら次のステージに進めるようにしたい!」
ならどうするか?
PlayerPrefsを利用する。 --データを保存してくれる機能
→【使い方】
PlayerPrefsとそのメソッドを使って書き込みと読み出しを行う。読み書きの際にはキー(値を識別するための名前)と値となる数値や文字列が必要となる。
PlayerPrefs.SetInt ("Test", 100); //Testというキーで書き込み
int v = PlayerPrefs.GetInt("Test"); //testというキーで読み出し
メソッドには値を設定する**Set@@@と、値を取得するGet@@@**があり、それぞれにfloat, int, string型の3種類用意されている。
上の例では"Test"というキーを入力することで、100というint型の整数を入手している。
void Start () {
PlayerPrefs.SetInt ("test", 100);
int i = PlayerPrefs.GetInt ("test");
Debug.Log (i);
}
これで返される値は100。 簡単だね。
##では応用編
ゲームクリア時にクリアしたステージの番号を書き込む処理をしよう。
すでにステージ4をクリアしているのにステージ1をクリアしたら、クリアしたステージの情報が1に書き換わるのは嫌なので、書き込み済みの値と比較して、それより大きいときだけ書き込むようにする。
//セーブデータ更新
if(PlayerPrefs.GetInt("CLEAR", 0)<StageNo){
//セーブされているすてーじNoより今のステージNoが大きければ
PlayerPrefs.SetInt("CLEAR", StageNo); //ステージナンバーを記録
最初はGetIntメソッドは0を返すので問題なし。
いま記録されているステージナンバーより今クリアしたステージのほうがナンバーが上のときだけ、SetIntでそのステージのナンバーが値に更新される。次のステージに行ったとき、最初の行の0は、先程クリアしたステージナンバー#になっている。
##ちょっと粋な計らい
ステージクリア後に自動的に画面を移す。
Invokeメソッドを使って、
Invoke("GobackStageSelect",3.0f);
第一引数に指定するのはメソッドで、第2引数はその時間後に第一引数を呼び出す。この場合は、事前に
void GoBackStageSelect(){
}
を作成しているという前提。
##どこまでクリアしたかの情報をセレクト画面に反映させる
public GameObject[] stageButtons; //ステージ選択ボタン配列
void Start () {
//どのステージまでクリアしているのかをロード(セーブ前なら0)
int clearStageNo = PlayerPrefs.GetInt("CLEAR", 0);
//ステージボタンを有効化
for (int i = 0; i <= stageButtons.GetUpperBound (0); i++) {
bool b;
if (clearStageNo < i) {
b = false; //前ステージをクリアしていなければ無効
} else {
b = true; //前ステージをクリアしていれば有効
}
//ボタンの有効・無効を設定
stageButtons [i].GetComponent<Button> ().interactable = b;
}
}
順に解説していくと、
パブリック変数stageButtonsを追加。
Startメソッド内で、変数clearStageNoを定義、これにはセーブデータが入る。
for文でstageButtonsの配列の要素数になるまでiに1ずつ足していき、iが要素数を超えるまで繰り返し以下の処理を行う。
ちなみにGetUpperBoundメソッドは、配列変数の要素数を数えるArrayクラスのメソッドで、引数には次元数をセットし、一次元変数の場合は0をいれる。
bをbool型変数(true or false)として定義し、clearStageNoがiより小さいならbにfalseを代入。
clearStageNoがi以上ならばbにtrueを代入。ここで**for文のカウンターが0から始まっていることに注意。**つまり、ステージ1を表すカウンター変数iは0となるので、clearStageNoが0のときはclearStageNo以下となってクリック可能となる。
つまり可視化するとこういうこと
変数i | 0 | 1 | 2 |
stage |未プレイ | 1 | 2 | 3 |
clearstageNo | 0 | 1 | 2 | 3 |
clearstage < i 無効
clearstage >= i 有効
iとclearの値を比較している。なにもクリアしていない状態のときは、0が入っている状態なのでelseの方の処理に入る。ステージ1のカウンター変数は0なので、クリック可能。
trueのときの処理を見てみよう。
bにtrueが代入される。
その後は true , false でも下の処理に進む。
interactable = b;
となっている。
これは、Buttonコンポーネントで、値がfalseのときは、そのボタンはクリックできないようになる。
###おまけ
動作テストのためにPlayerPrefsに記録したデータを消して初期状態に戻したいときがある。
そのときはプログラムのどこかのStartメソッドに「PlyerPrefs.DeleteAll();」と書いて、一度プレイモードにし、その後に書いたやつを削除する。特定のデータだけ消したい場合はDeleteKeyメソッドを利用する。