質問: PlayerPrefs.GetInt ("STAGE_04_CLEAR", "0"); (以下略) // ステージ1をクリア済みか if(clearStage01){ // クリア済みの処理 } else { // 未クリアの処理 } if(clearStage02){ // クリア済みの処理 } else { // 未クリアの処理 } (以下略) ``` 現在はこんな書き方をしていて動くは動きます。 しかし、この場合だとステージ10個分をPlayerPrefsでデータを読み込み、そしてそれに対応したif文をつらつら書くのでひたすらソースコードが長くなります。かなり非効率的かつ拡張性や汎用性がまったくないやり方なのでなんとか変えたいです。 お知恵をお借りできないでしょうか。よろしくお願い致します。
回答: PlayerPrefsの問題と言うよりも、変数の取り扱いの問題ですかね。 こういう時は**「配列」**を使いましょう。 ``` bool[] clearStage; //boolの配列型で宣言 int maxStage = 10; //何ステージまであるか //保存データを読み込む //やりやすいようにキーは「STAGE_1_CLEAR」「STAGE_2_CLEAR」という想定(0埋めも一応可能ですが) clearStage = new bool[maxStage]; for (int i = 0; i < maxStage; i++) { clearStage[i] = (PlayerPrefs.GetInt ("STAGE_"+(i+1)+"_CLEAR", "0") == 1); } //まとめて保存する for (int i = 0; i < maxStage; i++) { PlayerPrefs.SetInt ("STAGE_"+(i+1)+"_CLEAR", (clearStage[i]) ? 1 : 0 ); } //クリア判定 //ステージ1をクリア済みか?(配列は0から始まるので、求めたいステージ数から1引いた数の要素を見る) if (clearStage[0]) { // クリア済みの処理 } else { // 未クリアの処理 } //クリア判定 //全部クリア済みか?(Linq等使うともっとスマートになるけど一応foreachで) bool isAllClear = true; foreach (bool flag in clearStage) { if (!flag) { isAllClear = false; break; } } //クリア判定・おまけ //クリアした最大のステージ数を求める(Linq等使うともっとスマートになるけど一応forで) int clearStageNum = 0; for (int i = maxStage-1; i >= 0; i--) { if (clearStage[i]) { clearStageNum = i; break; } } ``` (これはどういう意味?という行があればコメントください) PlayerPrefs以外を使ったとしても、こういう列挙するような値は大体配列に入れることになります。 配列の他、List型やDictionary型が使われる場合もありますので覚えておくといいと思います。 (特にJSONを使うセーブの場合はややこしくなるかも) PlayerPrefsは簡単に使えますが実際不便な場合もありますので、どのセーブシステムがいいかはお好みでどうぞ。