しっぽを追いかけて

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

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

Unity の Roslyn で自動生成されたコードの中身を確認する

※ これは 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 のメニュー拡張とかでコード出力するしかなさそう