【Unity】System.Text.JsonでTaskを利用した非同期処理をしよう!
UnityではJSONを扱うためにJsonUtilityクラスが提供されています。JSONはネットワーク通信やIO周りで利用することが多いのにTaskの非同期処理には対応していないので非常に不便です。System.Text.Jsonを利用すれば非同期処理に対応されているので簡潔に並列処理を実装することができます。
ツール | バージョン |
---|---|
Unity Editor | 2022.3.26f1 |
System.Text.Json | 8.0.3 |
UnityのJsonUtilityによるJSONの取り扱いはこちらの記事をご覧下さい。
JSONの非同期処理をしたいけど、どうやれば簡単に記述できるかな?
初めての方にも分かりやすく簡単に解説しますね。
準備
まず初めに必要なDLLを用意しよう!
NuGet GalleryからSystem.Text.Json本体と依存パッケージ3つの合わせて4つのパッケージをダウンロードします。
https://www.nuget.org/packages/System.Text.Json/
microsoft.bcl.asyncinterfaces.8.0.0.nupkg |
system.runtime.compilerservices.unsafe.6.0.0.nupkg |
system.text.encodings.web.8.0.0.nupkg |
system.text.json.8.0.3.nupkg |
解凍してlib/netstandard2.0フォルダー以下にあるDLLをUnityのAssets以下へコピーします。
nupkgはzip形式なので拡張子をzipに変更して解凍できますよ。
使い方
JsonUtilityの使い方をおさらいしよう!
UnityのJsonUtilityクラスで利用するためにSystem.Serializable属性を付加してpublicまたは、SerializeField属性の非publicメンバーがシリアライズされます。
[System.Serializable]
class Item
{
public string name; // 1
[SerializeField]
private int price; // 2
}
JsonUtility.FromJsonでデシリアライズできます。
string json = "{\"name\":\"ひのきのぼう\",\"price\":5}";
Item item = JsonUtility.FromJson<Item>(json);
System.Text.Jsonの場合はどうなるのかな?
System.Text.JsonのJsonSerializerはpublicなプロパティーもシリアライズしてくれます。属性も付加する必要もなくキレイに実装できます。
class Item
{
public string name { get; set; }
public int price { get; set; }
}
JsonSerializer.Deserializeでデシリアライズできます。
string json = "{\"name\":\"ひのきのぼう\",\"price\":5}";
Item item = JsonSerializer.Deserialize<Item>(json);
非同期デシリアライズ処理はJsonSerializer.DeserializeAsyncを利用します。
async Task<Item> DeserializeAsync(string json)
{
var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
return await JsonSerializer.DeserializeAsync<Item>(ms);
}
var task = Task.Run(() => DeserializeAsync(json));
簡潔に非同期処理を実装できそうだね!
JsonUtilityでは対応していない配列のシリアライズもできるから便利ですね。
まとめ
今回の記事のまとめだよ!
・System.Text.JsonをUnityに導入しよう! ・JSONを非同期処理できるようになるよ! ・配列のシリアライズにも対応しているよ! | ||
JSONを非同期処理できるようになると便利だね!
JSONを利用するコンテンツ開発が増えているので積極的に利用しましょう。
関連ページ
こちらのページも合わせてご覧下さい