# 创建与使用源代码生成器

> 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 包。源代码生成器必须使用 [Microsoft.CodeAnalysis.Csharp 4.3](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp/4.3.0) 才能与 Unity 配合使用。

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)** 下方，禁用**编辑器**和**独立平台**。

10. 在**资源标签 (Asset Labels)** 下，单击标签图标以打开资源标签 (Asset Labels) 子菜单。

11. 创建并分配名为 **RoslynAnalyzer** 的新标签。要进行此操作，请在资源标签 (Asset Labels) 子菜单的文本输入字段中输入 `RoslynAnalyzer`，然后按回车键。此标签必须完全匹配并且区分大小写。创建后，该标签将在资源标签 (Asset Labels) 子菜单中显示。可以在菜单中单击标签名称，将其分配给其他分析器。

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. 将此脚本添加到场景中的游戏对象并进入运行模式。来自源代码生成器的消息将在游戏主机 (Console) 窗口中显示，包括时间戳。由于此源代码生成器将注入至多个程序集，控制台中也会出现警告。解决方案是在内部执行上述示例中的 `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)
