# 소스 제너레이터 생성 및 사용

> 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 네임스페이스 기술 자료](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**라는 새 레이블을 생성하고 할당합니다. 이 작업을 수행하려면 Asset labels 하위 메뉴의 텍스트 입력 필드에 `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의 [소스 제너레이터 기술 자료](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)
