えんじにあ雑記!

開発していて学んだことをまとめていきます!

Unity向けSource Generatorの作り方

Unity2021.2以降Roslynの導入によって利用可能になったSource Generator。今回はSource Generatorの実装方法についてまとめます。

使用環境

  • Unity 2022.2.14f1
  • Rider 2023.1
  • Microsoft.CodeAnalysis.CSharp 3.9.0

プロジェクトの作成

今回はRiderを使用します。新規プロジェクト作成からClass Libraryを選択し、Target Frameworkはnetstandard2.0を設定して作成します。

次にMicrosoft.CodeAnalysis.CSharp 3.9.0をNuGetからインストールします。

コード生成部分の実装

新規クラスを作成し、Generator属性の付与とISourceGeneratorを実装します。

using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;

namespace MyAttributeGenerator
{
    [Generator]
    public class MyCodeGenerator : ISourceGenerator
    {
        public void Initialize(GeneratorInitializationContext context)
        {
        }

        public void Execute(GeneratorExecutionContext context)
        {
            var code = SourceText.From(@"
using System;

namespace MyCodeGenerator
{
    [AttributeUsage(AttributeTargets.Class)]
    public class MyCustomAttribute : Attribute
    {
        public MyCustomAttribute() {}
    }
}", Encoding.UTF8);
            context.AddSource("MyCustomAttribute.g.cs", code);
        }
    }
}

プロジェクトのビルドとUnityへの配置

上記のコードを実装したら最後にプロジェクトをビルドしてdllを作成します。 Build Solutionの設定をReleaseに設定した状態でビルドを実行します。

ビルドが成功したらMyAttributeGenerator\bin\Release\netstandard2.0\MyAttributeGenerator.dllを見つけてUnityに配置します。

Source Generatorとして作成したdllはUnityに配置した際に下記の項目を設定する必要があります。

  • Select platforms for pluginのチェックを外す
  • AssetLabelにRoslynAnalyzerを設定する

コードが生成されていることを確認

ここまでできれば実際にコードが生成できていることが確認できます。試しにMyCustomAttributeを使用するサンプルコードを記述してみます。

using MyCodeGenerator;

[MyCustom]
public class Sample
{
}

まとめ

今回はUnity向けにSource Generatorを開発する手順を解説しました。 Unity2022.2、2023.1のみにバージョンを限定する場合はMicrosoft.CodeAnalysis.CSharp 4.xが利用できるため、Incremental Source Generatorも使用できます。 プロジェクトの都合によってはそちらで開発するのも良いかもしれません。Incremental Source Generatorの実装方法はまた別の記事で開設しようと思います。

neue.cc