1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[備忘録]Unity で始める C# セーブについての調べたことまとめ

Posted at

#「ステージセレクト画面を作って、前のステージをクリアしたら次のステージに進めるようにしたい!」

ならどうするか?
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メソッドを利用する。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?