2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unity 2D #3 androidにおけるjsonファイルの読み書き

Last updated at Posted at 2020-11-12

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で処理を分ける必要がありません。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?