しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で MemoryPack の属性記述を自動生成したい

※ これは 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() するのは避けないといけない