※ これは 2023/10/19 時点の Unity 2023.1.17f1 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
前回で Unity の Roslyn を利用し MemoryPack 用の属性記述を自動生成してみた
しかし、UnityEditor で実行するとシリアライズエラーになってしまったので、生成されたコード記述を確認してみたい
スポンサードリンク
コード生成プロジェクトの CodeGenerator.cs
のコード出力部分
下記の部分を
context.AddSource($"{name}.g.cs", SourceText.From(sb.ToString(), Encoding.UTF8));
次のように変更
context.AddSource($"{name}.g.cs", SourceText.From(sb.ToString(), Encoding.UTF8)); var filePath = ((CSharpCompilation)context.Compilation).SyntaxTrees[0].FilePath; var outputPath = Path.Combine(filePath.Substring(0, filePath.LastIndexOf("Assets")), "Logs"); File.WriteAllText(Path.Combine(outputPath, $"{name}.g.cs"), sb.ToString());
Unity のプロジェクトパスにある Logs
ディレクトリに生成したソースコードを保存する記述を追加
いつものように VSCode のソリューションエクスプローラーの右クリックメニューから「リビルド」実行
Logs
のディレクトリを見ると Data.g.cs
が出力されているのでこれを開いてみる
ソースコードの中身はこんな感じ
// <auto-generated/> using MemoryPack; using System.Collections.Generic; [MemoryPackable] public partial class Data { /// <summary> /// Fooプロパティ /// </summary> [MemoryPackIgnore] public string Foo { get => this.foo; set { if (this.foo != value) { this.foo = value; } } } [MemoryPackInclude] private string foo = null; /// <summary> /// Barプロパティ /// </summary> [MemoryPackIgnore] public string Bar { get => this.bar; set { if (this.bar != value) { this.bar = value; } } } [MemoryPackInclude] private string bar = null; }
特に間違った箇所もない⋯薄々気づいてはいたけど、MemoryPack 自体が Roslyn によるコード生成を利用しているので、どうやら Roslyn のコード生成によって出力されたクラスは参照できないらしい
MemoryPack 用の属性定義を含むコードを生成する場合は、Roslyn ではなく Unity のメニュー拡張とかでコード出力するしかなさそう