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

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

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

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

Json形式

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

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


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

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

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

これをJson形式に変換するには
このクラスのインスタンスを作成してJsonUtility.ToJsonに渡します。
するとJson形式のテキストが帰ってくるのでstringの変数にしまいます。
なので実際に使うとこんな感じです。

MusicScore ms =  new MusicScore();
string json = JsonUtility.ToJson(ms);

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


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

JsonUtility.FromJsonOverwrite(json, ms);

と書きます。

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

X = JsonUtility.FromJson<MusicScore>(json);

ファイルへの書き出し

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

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

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

using System.IO

を書く必要があります

書き出し処理は

 File.WriteAllText(FilePath, json);

のように書きます。

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

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

例えば

"Assets\\Test.json" 

なら、Assetsフォルダの中のTest.jsonというファイルに書き出されます。
(そのようなファイルが無い場合は自動で生成されます。)
(バックスラッシュはwindowsの半角の¥マークです。)

"Assets\\ABC\\Test.json" 

なら、Assetsフォルダの中のABCフォルダの中の
Test.jsonというファイルに書き出されます。

注意点ですが
Test.jsonファイルは自動で生成されますが、
ABCフォルダは自分でつくらないと、存在しなかった場合エラーになります。


ファイルの読み取り

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

先ほど同様

using System.IO

を書いておきます。

そして、string型の変数に↓のように取得します。

 string json = File.ReadAllText(FilePath);

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

これで、保存した変数をjson形式で取得できるので、

JsonUtility.FromJsonOverwrite(json, ms);

とかでインスタンスに反映すればOKです。


おまけ

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

f:id:sawalemontea:20170922120424p:plain

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

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

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


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

今回はここまでです。



www.sawalemontea.com