MessagePack for C#のSourceGeneratorをUnityに導入する
MessagePack for C#とは?
MessagePack形式へのシリアライズを行うライブラリ。シリアライザーとしては.NETで最速クラスの性能かつ、豊富な機能や圧縮の対応、拡張性の高さなどを併せ持つ。また、Unityでの利用もサポートされている。
SourceGenerator対応
従来のバージョンでは、AOT環境に対応させるためにはmpcという専用の外部ツールを用いてコード生成を行う必要があったが、動作が不安定であったり、Windows以外で動作させるのが大変だったりと面倒な部分が多かった。
しかしv2.6以降でSourceGeneratorに対応し、コンパイル時にコード生成が自動で行われるようになった。(v2.6は現在Alpha版としてリリースされている)
これにより面倒な事前生成を行わずにシリアライザを使用できるようになった。
Unityに導入する
まずはv2.6以降のバージョン(現在はAlpha版)をReleaseから入手し、.unitypackageファイルをプロジェクトにインポートする。
加えて専用のSourceGeneratorを導入する必要がある。MessagePack.SourceGenerator.Unity.zipを展開し、中に入っている.dllファイルを全てプロジェクトにインポートする。
SourceGeneratorを動作させる
UnityでSourceGeneratorを動作させるには特定の設定を行う必要がある。
.dllを選択し、Select platform for pluginのチェックを全て外す。(コンパイル時にコードを生成するため、SourceGenerator自体をビルドに含める必要はない)
さらにRoslynAnalyzer
のタグを追加する。このタグによってUnityはSourceGeneratorのdllを認識する。
これを全てのSourceGeneratorのdllに対して行う。
Resolverを登録する
ユーザー定義のクラスのシリアライズを行う際には、事前にResolverの登録を行う必要がある。
MessagePack for C#のSourceGeneratorはGeneratedMessagePackResolver
というResolverを生成するため、これを最初に追加しておく。
var resolver = CompositeResolver.Create(
GeneratedMessagePackResolver.Instance, // 生成されたResolver
StandardResolver.Instance
);
// デフォルトのOptionを更新
MessagePackSerializer.DefaultOptions = MessagePackSerializerOptions.Standard
.WithResolver(resolver);
以上でセットアップは完了。あとは通常通りシリアライズを行えばOK。