Closed5

MessagePack for C#のSourceGeneratorをUnityに導入する

Annulus GamesAnnulus Games

SourceGenerator対応

従来のバージョンでは、AOT環境に対応させるためにはmpcという専用の外部ツールを用いてコード生成を行う必要があったが、動作が不安定であったり、Windows以外で動作させるのが大変だったりと面倒な部分が多かった。

しかしv2.6以降でSourceGeneratorに対応し、コンパイル時にコード生成が自動で行われるようになった。(v2.6は現在Alpha版としてリリースされている)
これにより面倒な事前生成を行わずにシリアライザを使用できるようになった。

https://twitter.com/neuecc/status/1674283523321257984

Annulus GamesAnnulus Games

Unityに導入する

https://github.com/MessagePack-CSharp/MessagePack-CSharp/releases/tag/v2.6.100-alpha

まずはv2.6以降のバージョン(現在はAlpha版)をReleaseから入手し、.unitypackageファイルをプロジェクトにインポートする。

加えて専用のSourceGeneratorを導入する必要がある。MessagePack.SourceGenerator.Unity.zipを展開し、中に入っている.dllファイルを全てプロジェクトにインポートする。

Annulus GamesAnnulus Games

SourceGeneratorを動作させる

https://docs.unity3d.com/Manual/roslyn-analyzers.html?_fsi=eI7L9mc7

UnityでSourceGeneratorを動作させるには特定の設定を行う必要がある。

.dllを選択し、Select platform for pluginのチェックを全て外す。(コンパイル時にコードを生成するため、SourceGenerator自体をビルドに含める必要はない)
さらにRoslynAnalyzerのタグを追加する。このタグによってUnityはSourceGeneratorのdllを認識する。

これを全てのSourceGeneratorのdllに対して行う。

Annulus GamesAnnulus Games

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。

このスクラップは2023/10/25にクローズされました