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); } }