# ソースジェネレータを作成して使用する

> Create a simple source generator and configure the Unity Editor to use it for your Unity project code.

ソースジェネレーターをスクリプトコンパイルプロセスの追加ステップとして使用し、既存のコードをコンパイルしながら新しいコードを追加できます。コードアナライザーと同様に、既存のソースジェネレーターを使用することも、独自に作成することもできます。

**ノート**: Unity は、`System.Text.Json` 名前空間のバージョン 6.0.0- プレビューのみをサポートします。アプリケーションでこの名前空間を使用する場合は、必ずバージョン `6.0.0-preview` を使用してください。`System.Text.Json` の詳細については、Microsoft の [System.Text.Json Namespace のドキュメント](https://docs.microsoft.com/en-us/dotnet/api/system.text.json?view=net-6.0) を参照してください。

Visual Studio でソースジェネレーターを作成し、Unity プロジェクトで使用するために適用する手順は、以下のとおりです。

1. Visual Studio で、.NET Standard 2.0 をターゲットとする C# クラスライブラリプロジェクトを作成し、プロジェクトに `ExampleSourceGenerator` という名前を付けます。

2. プロジェクトの `Microsoft.CodeAnalysis.Csharp` NuGet パッケージをインストールします。ソースジェネレーターが Unity で動作するには、[Microsoft.CodeAnalysis.Csharp 4.3](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp/4.3.0) を使用する必要があります。

3. Visual Studio プロジェクトで、新しい C# ファイルを作成し、以下のコードを追加します。

   ```lang-C#
   using Microsoft.CodeAnalysis;
   using Microsoft.CodeAnalysis.Text;
   using System.Text;

   namespace ExampleSourceGenerator
   {
       [Generator]
       public class ExampleSourceGenerator : ISourceGenerator
       {
           public void Execute(GeneratorExecutionContext context)
           {
               System.Console.WriteLine(System.DateTime.Now.ToString());

               var sourceBuilder = new StringBuilder(
               @"
               using System;
               namespace ExampleSourceGenerated
               {
                   public static class ExampleSourceGenerated
                   {
                       public static string GetTestText()
                       {
                           return ""This is from source generator ");

               sourceBuilder.Append(System.DateTime.Now.ToString());

               sourceBuilder.Append(
                   @""";
                       }
       }
   }
   ");

               context.AddSource("exampleSourceGenerator", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));
           }

           public void Initialize(GeneratorInitializationContext context) { }
       }
   }
   ```

4. **リリース**用のソースジェネレーターをビルドします。これを行うには、**Build** に移動し、**Batch Build** オプションを選択し、**Release** オプションを選択して **Build (ビルド)** します。

5. ソースジェネレーターのプロジェクトフォルダーで、`bin/Release/netstandard2.0/ExampleSourceGenerator.dll` ファイルを探します。

6. このファイルを Unity プロジェクト内の Assets フォルダーにコピーします。

7. アセットブラウザーで .dll ファイルをクリックし、[Plugin Inspector](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/plug-in-inspector.md) ウィンドウを開きます。

8. **Select platforms for plugin** で、**Any Platform** を無効にします。

9. **Include Platforms** の下で、**Editor** と **Standalone** を無効にします。

10. **Asset Labels** の下で、ラベルアイコンをクリックしてアセットラベルサブメニューを開きます。

11. **RoslynAnalyzer** という新しいラベルを作成して割り当てます。それには、アセットラベルサブメニューのテキスト入力フィールドに `RoslynAnalyzer` と入力し、Enter キーを押します。このラベルは正確に一致する必要があり、大文字と小文字が区別されます。ラベルを作成すると、それ以降はアセットラベルサブメニューに表示されます。メニューでラベルの名前をクリックして、他のアナライザーに割り当てることができます。

12. このソースジェネレーターは複数のアセンブリに挿入されるため、コンソールに警告が表示されます。上記の例の `ExampleSourceGenerated` を内部的にするか、名前自体を生成することで解決します。

13. ソースジェネレーターの動作をテストするには、エディターで以下のコードを使用して [新しい MonoBehaviour スクリプトを作成](/engine/6000.0/manual/scripting/get-started/creating-scripts.md) します。

    ```lang-C#
    using UnityEngine;

    public class HelloFromSourceGenerator : MonoBehaviour
    {
        static string GetStringFromSourceGenerator()
        {
            return ExampleSourceGenerated.ExampleSourceGenerated.GetTestText();
        }

        // Start is called before the first frame update
        void Start()
        {
            var output = "Test";
            output = GetStringFromSourceGenerator();
            Debug.Log(output);
        }
    }
    ```

14. このスクリプトをシーンのゲームオブジェクトに追加して、再生モードを開始します。ソースジェネレーターからのメッセージがコンソールウィンドウにタイムスタンプを含めて表示されます。このソースジェネレーターは複数のアセンブリに挿入されるため、コンソールには警告も表示されます。上記の例の `ExampleSourceGenerated` を内部的にするか、名前自体を生成することで解決します。

ソースジェネレーターの詳細については、Microsoft の [Source Generators のドキュメント](https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview) を参照してください。

## 追加リソース##additional-resources

* [既存のアナライザーまたはソースジェネレーターをインストールして使用する](/engine/6000.0/manual/scripting/debugging-and-diagnostics/roslyn-analyzers/install-existing-analyzer.md)
