ソースジェネレーターをスクリプトコンパイルプロセスの追加ステップとして使用し、既存のコードをコンパイルしながら新しいコードを追加できます。コードアナライザーと同様に、既存のソースジェネレーターを使用することも、独自に作成することもできます。
ノート: Unity は、System.Text.Json 名前空間のバージョン 6.0.0- プレビューのみをサポートします。アプリケーションでこの名前空間を使用する場合は、必ずバージョン 6.0.0-preview を使用してください。System.Text.Json の詳細については、Microsoft の System.Text.Json Namespace のドキュメント を参照してください。
Visual Studio でソースジェネレーターを作成し、Unity プロジェクトで使用するために適用する手順は、以下のとおりです。
Visual Studio で、.NET Standard 2.0 をターゲットとする C# クラスライブラリプロジェクトを作成し、プロジェクトに ExampleSourceGenerator という名前を付けます。
プロジェクトの Microsoft.CodeAnalysis.Csharp NuGet パッケージをインストールします。ソースジェネレーターが Unity で動作するには、Microsoft.CodeAnalysis.Csharp 4.3 を使用する必要があります。
Visual Studio プロジェクトで、新しい 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) { }
}
}
リリース用のソースジェネレーターをビルドします。これを行うには、Build に移動し、Batch Build オプションを選択し、Release オプションを選択して Build (ビルド) します。
ソースジェネレーターのプロジェクトフォルダーで、bin/Release/netstandard2.0/ExampleSourceGenerator.dll ファイルを探します。
このファイルを Unity プロジェクト内の Assets フォルダーにコピーします。
アセットブラウザーで .dll ファイルをクリックし、Plugin Inspector ウィンドウを開きます。
Select platforms for plugin で、Any Platform を無効にします。
Include Platforms の下で、Editor と Standalone を無効にします。
Asset Labels の下で、ラベルアイコンをクリックしてアセットラベルサブメニューを開きます。
RoslynAnalyzer という新しいラベルを作成して割り当てます。それには、アセットラベルサブメニューのテキスト入力フィールドに RoslynAnalyzer と入力し、Enter キーを押します。このラベルは正確に一致する必要があり、大文字と小文字が区別されます。ラベルを作成すると、それ以降はアセットラベルサブメニューに表示されます。メニューでラベルの名前をクリックして、他のアナライザーに割り当てることができます。
このソースジェネレーターは複数のアセンブリに挿入されるため、コンソールに警告が表示されます。上記の例の ExampleSourceGenerated を内部的にするか、名前自体を生成することで解決します。
ソースジェネレーターの動作をテストするには、エディターで以下のコードを使用して 新しい MonoBehaviour スクリプトを作成 します。
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);
}
}
このスクリプトをシーンのゲームオブジェクトに追加して、再生モードを開始します。ソースジェネレーターからのメッセージがコンソールウィンドウにタイムスタンプを含めて表示されます。このソースジェネレーターは複数のアセンブリに挿入されるため、コンソールには警告も表示されます。上記の例の ExampleSourceGenerated を内部的にするか、名前自体を生成することで解決します。
ソースジェネレーターの詳細については、Microsoft の Source Generators のドキュメント を参照してください。