2015年04月08日

Unityでデータのセーブとロードを実装する(その1)


サーバーとのデータの送受信の前にやればよかった気も…(;・∀・)

Unityでゲームを作ってると、
『ベストスコアをセーブする機能』とか、
『前回までの続きをロードする機能』とか、
とかくセーブandロードの機能を持たせたくなるのが人情だと思います。
今回はそれの実装その1ということで。

とりあえず、データのセーブとロードを実装した単純なコードはこちら。
読み書きするデータの型は、Int型です。

//受け取ったデータをセーブするメソッド
void SaveScore(int score){

  //受け取ったデータをセーブ
  PlayerPrefs.SetInt("score",score);

  Debug.Log("score="+score+":セーブしたわよッ!!(・∀・)");

}
//データをロードするメソッド
int LoadScore(){

  //ロードしたデータを代入する変数
  int loadedScore;

  //データをロード
  loadedScore=PlayerPrefs.GetInt("score");

  Debug.Log("score="+loadedScore+":ロードしたわよッ!!ヽ(`Д´#)ノ");

  //ロードした値を参照元に返す
  return loadedScore;

}

デバッグプリントなどはとりあえず置いておいて、
実際にデータを読み書きしている部分はココです。

  //受け取ったデータをセーブ
  PlayerPrefs.SetInt("score",score);

  //データをロード
  loadedScore=PlayerPrefs.GetInt("score");

この『PlayerPrefs』てのを利用してあげると、
簡単にデータのセーブやロードが出来ます。
具体的にどの箇所にデータが保存されているかはとりあえず置いておいて…(;・∀・)

  //受け取ったデータをセーブ
  PlayerPrefs.SetInt("score",score);

これは、変数scoreに代入されている値を、”score”というキーをつけて保存しています。
PHPで言えば連想配列みたいな感じですかね。$data[“score”]=scoreて具合でしょうか?
こうすることで、変数score内の値が”score”という名前でセーブされるわけです。

  //データをロード
  loadedScore=PlayerPrefs.GetInt("score");

一方こちらは、”score”というインデックスキー付で保存されたデータを読み込み、
それを変数loadedScoreに代入しています。
こうすることで、セーブされたデータのロードが可能なのです。

また今回、データがInt型なのでそれぞれSetInt,GetIntとなっています。
このIntの部分は読み書きするデータの型によって変化します。

  //float型のデータをセーブするとき
  PlayerPrefs.SetFloat("score",floatScore);

  //string型のデータをロードするとき
  stringData=PlayerPrefs.GetString("score");

こんな感じで、セーブの時は『Set○○』、ロードの時は『Get○○』て具合で、
○○の部分は読み書きするデータの型に応じて書き換えます。

また、このPlayerPrefsを使えば、
指定されたキーの名前がついているデータがあるかどうかも確認出来まして…

//キー"score"のデータがセーブされているか確認する
if(PlayerPrefs.HasKey("score")){
 //データをロード
 loadedScore=PlayerPrefs.GetInt("score");
 Debug.Log("score="+loadedScore+":ロードしたわよ(・∀・)");
}
else{
 Debug.Log("そんなデータ保存されてないわよッ!!ヽ(`Д´#)ノ");
}

こうして『PlayerPrefs.HasKey』を使ってあげると、
指定したキーのデータの有無がbool型で返されるので、
エラーチェックなんかにも使えそうですね。
あとは、『このキーのデータがなかったら、新しくデータ作ってセーブしときなさい』
的な使い方も出来そうです。

ところで、このPlayerPrefsですが、
読み書き出来るデータの型が『Int』『Float』『String』だけのようです。
また、配列は読み書き不可のようです。

また、『SetString』『GetString』は半角英数の読み書きは可能ですが、
日本語の読み書きに関しては若干問題があるご様子。
次回はその辺を解決したいなぁと思います。

 

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)