※ これは 2023/10/26 時点の Unity 2023.1.18f1 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
前回で Unity の Roslyn を利用し MemoryPack 用の属性記述を自動生成してみた
しかし、自動生成コードの中身は問題なさそうだったので、Roslyn を経由せずに利用して確認する
スポンサードリンク
まずはコード生成プロジェクトの CodeGenerator.cs
のコード出力部分
下記の部分を
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());
次のように変更
//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());
Roslyn にコードを渡す処理をコメントアウトして、Logs にソースファイルを出力するところだけ残した
いつものように VSCode のソリューションエクスプローラーの右クリックメニューから「リビルド」実行
Logs
のディレクトリを見ると Data.g.cs
が出力されているのでこれを Unity のプロジェクトの Assets/Scripts
にコピーする
あとは前々回と同じように実行
今度はシリアライズエラーにならなかった
やはり Roslyn を利用する MemoryPack から参照されるコードは、Roslyn を経由して AddSource()
するのは避けないといけない