스크립트 컴파일 프로세스의 추가 단계로 소스 제너레이터를 사용하여 기존 코드를 컴파일하는 동안 새 코드를 추가할 수 있습니다. 코드 분석기와 마찬가지로 기존 소스 제너레이터를 사용하거나 직접 생성할 수 있습니다.
참고: Unity는 System.Text.Json 네임스페이스의 6.0.0 프리뷰 버전만 지원합니다. 애플리케이션에서 이 네임스페이스를 사용하려면 6.0.0-preview 버전을 사용해야 합니다. System.Text.Json에 대한 자세한 내용은 Microsoft의 System.Text.Json 네임스페이스 기술 자료를 참조하십시오.
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라는 새 레이블을 생성하고 할당합니다. 이 작업을 수행하려면 Asset labels 하위 메뉴의 텍스트 입력 필드에 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의 소스 제너레이터 기술 자료를 참조하십시오.