androidではStreamReaderによるIOができません。そのため、unityのEditorとjsonファイルの読み方を変えなければなりません。
以前のUnity 2D #2で作成したCharacterTableのjsonファイルをandroidでも読み込めるようにします。
CharacterTableの概要
[System.Serializable]
public class CharacterTable{
public List<CharacterIndividual> characters;
}
[System.Serializable]
public class CircleIndividual {
[SerializeField] public int Id;
[SerializeField] public string Name;
}
CharacterTableの読み込み
IEnumerator CharacterStatusSet()
{
CharacterTable gettwo;
string filePath = Application.streamingAssetsPath+"/Characters.json";
#if UNITY_EDITOR
StreamReader reader = new StreamReader(filePath);
string getone = reader.ReadToEnd();
reader.Close();
gettwo = JsonUtility.FromJson<CharacterTable>(getone);
#elif UNITY_ANDROID
UnityWebRequest www = UnityWebRequest.Get(filePath);
www.SetRequestHeader("Content-Type", "application/json");
yield return www.SendWebRequest();
string tmptext = www.downloadHandler.text;
gettwo = JsonUtility.FromJson<CharacterTable>(tmptext);
#endif
// gettwo.characters[0].Name
// 炎の魔術師
yield return null;
}
#if UNITY_EDITOR ~ #elif までに記述したコードはunityのeditor上で実行され、android端末で実行したときは#elif UNITY_ANDROID ~ #endif までに記述したコードが実行されます。
また、jsonファイル(Characters.json)はAssetsフォルダ直下にStreamingAssetsフォルダを作成し、その中に入れています。
Assetsフォルダ直下にjsonファイルを配置し、filePathをApplication.dataPath+"/Characters.json"とした場合、androidとeditorでApplication.dataPathが示す場所が異なるため、android端末でうまく読み込みすることができません。
また、関数CharacterStatusSetは
StartCoroutine(CharacterStatusSet());
で呼び出すコルーチンとなっており、CharacterStatusSetを普通の関数で記述してしまうと、これもファイルの読み込みが失敗する原因の一つとなってしまいます。
また、StreamingAssetsはandroid端末で情報の書き込みができない(らしい)ので、所持しているアイテムのデータなどはApplication.persistentDataPathの下にjson形式で保存したいと思います。
// ロード
StreamReader reader = new StreamReader(Application.persistentDataPath+"/character.json");
string getone = reader.ReadToEnd();
reader.Close();
CharacterTable gettwo = JsonUtility.FromJson<CharacterTable>(getone);
// セーブ
string characters_jsonToSave = JsonUtility.ToJson(gettwo);
StreamWriter streamWriter = new StreamWriter(Application.persistentDataPath + "/character.json", false);
streamWriter.Write(characters_jsonToSave);
streamWriter.Flush();
streamWriter.Close();
Application.persistentDataPathを使用する場合はandroid端末とunity editorで処理を分ける必要がありません。