
Unity で最も簡単にセーブ機能を導入できる PlayerPrefs + Json が Android 実機で動作しないという問題にぶち当たりました。
Unity エディタ上や WebGL では問題なく動作するのに、Android 実機でテストするとセーブ出来ないことが90%というとても不安定な動作になってしまいます。
マルチプラットフォーム開発の難しさを痛感します。
Jsonとは?
PlayerPrefs では保存できるデータ型が決まっており、int(整数)、float(浮動小数点数)、string(文字列) 型に限られます。
Unity 標準機能となった JsonUtility を使うと bool 型も保存できるようになります。
Json はテキストベースのデータ形式で、bool もテキストとして保存します。
対処したこと
Android では PlayerPrefs を使用せずに、外部に json ファイルを保存する形式に切り替えました。
※冒頭に「using System.IO;」が必要です。
※セーブデータ用のクラスを作っておく必要があります。
※セーブデータ用のクラスを作っておく必要があります。
準備
private void Awake(){
filepath = Application.persistentDataPath + "/" + "savedata.json";
if (File.Exists(filepath)){
LoadGames();
}else{
saveData = new SaveData();
}
}
セーブデータの json ファイルがあればロード、なければ新規セーブデータを作成。
セーブ
public void SaveGames(){
string json = JsonUtility.ToJson(saveData);
StreamWriter streamWriter = new StreamWriter(filepath);
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
ロード
public void LoadGames(){
if (File.Exists(filepath)){
StreamReader streamReader;
streamReader = new StreamReader(filepath);
string data = streamReader.ReadToEnd();
streamReader.Close();
saveData = JsonUtility.FromJson<SaveData>(data);
}
}