LemonteaのUnity部屋

UnityとかC#のおはなしです~

Unity Json形式とファイルへの書き出し・読み込み

こんにちは。レモンティーです。

昨日音ゲーの記事を書くと言いました。

今回は、その準備として、楽譜を書き出すのに
必要な三点の記事を書きます。

Json形式にしたり、戻したり
②ファイルへの書き出し
③ファイルの読み込み

です。

______________

Json形式

JsonとはJavaScript Object Notationの略で、データをテキストで記述する形式の一つです。
①では、↓の公式サイトを参考に、あるクラスの変数を丸ごとこの形式で表し、
stringの変数にいれてみます。

Unity - マニュアル: JSON 形式にシリアライズ


まずは、Json形式で保存したい変数をもったクラスをつくります。

この時、頭に[Serializable]とつけます。
(そのためには最初に using System; が必要)

[Serializable]
public class MusicScore
{
    public float Timing[];
    public float Notes[];
}

これをJson形式に変換するには
インスタンスを作成して…

MusicScore ms = MusicScore();

JsonUtility.ToJsonを使います。
これでできたJson形式のテキストは
stringの変数にしまいます。

なので実際に使うときはこんな感じです。
string json = JsonUtility.ToJson(ms);

これでmsの持っている変数の情報がすべてJson形式で表され、
string型の変数jsonに格納されました。


逆に、jsonファイルに書き込まれている内容を
あるインスタンスに反映させたい場合は

JsonUtility.FromJsonOverwrite(json, ms);


と書きます。

また、jsonファイルに書き込まれている内容を
新しく作ったインスタンスXに反映したい場合は
こう書きます。

X = JsonUtility.FromJson(json);



②ファイルへの書き出し

このままだと、ただstring変数に代入しただけで、
実行が終わったら消えてしまいます。

そこで、ファイルに保存してつかいます。

ファイルへの保存とかをいじるには、

using System.IO

を書く必要があります

書き出し処理は
File.WriteAllText(FilePath, json);
のように書きます。

jsonは、json形式でデータが書かれたstringの変数です。

FilePathは、ファイルの保存場所と名前です(string型)。

例えば
"Assets¥¥Test.json" なら
Assetsフォルダの中のTest.jsonというファイルに書き出されます。
(そのようなファイルが無い場合は自動で生成されます。)

"Assets¥¥ABC¥¥Test.json" なら
Assetsフォルダの中のABCフォルダの中の
Test.jsonというファイルに書き出されます。
Testファイルは自動で生成されますが、
ABCフォルダは自分でつくらないと、存在しなかった場合エラーになります。



③ファイルの読み取り

ファイルを読み取るには
File.ReadAllText(FilePath);
を使います。

先ほど同様
using System.IO
を書いておきます。

そして、string型の変数に↓のように取得します。
string json = File.ReadAllText(FilePath);

FilePathは先ほど同様、読み込むファイルの場所と名前です。

これで、保存した変数をjson形式で取得できるので、
①でやったように
JsonUtility.FromJsonOverwrite(json, ms);
インスタンスに反映すればOKです。


_________________




これをどう使うかというと
↓のように音符の流れてくるタイミングを
配列に記録して、それをJson形式で
ファイルに保存しておき、
実行時に読み込むわけです。

f:id:sawalemontea:20170922120424p:plain

なんか数字の羅列で一見使いにくそうすが
どうせインスタンスに反映するので

ms.Timing[〇] = ~;
のように完全にいつも通り使うことができます。

この例だと
赤線より上がタイミングで、下が音符の種類です。


これを使って楽譜を作っていきます。

今回はここまでです。