您可以在脚本编译过程中使用源代码生成器作为附加步骤,在编译现有代码时添加新代码。与代码分析器一样,您可以使用现有的源代码生成器或创建自己的源代码生成器。
注意:Unity 仅支持 System.Text.Json
命名空间的 6.0.0-preview 版本。如果您要在应用程序中使用此命名空间,请确保使用 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 包。您的源代码生成器必须使用 Microsoft.CodeAnalysis.Csharp 4.3 才能与 Unity 协同工作。
在 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) { }
}
}
为 发布 生成源代码生成器。为此,请转到 生成 并选择 批量生成 选项,然后选择 发布 选项并 生成。
在源代码生成器的项目文件夹中,找到 bin/Release/netstandard2.0/ExampleSourceGenerator.dll
文件。
将此文件复制到 Unity 项目的 Assets 文件夹中。
在资源浏览器中,单击 .dll 文件以打开 插件检查器 窗口。
在 选择插件的平台 下,禁用 任何平台。
在 包含的平台 下,禁用 编辑器 和 独立。
在 资源标签 下,单击标签图标以打开资源标签子菜单。
创建并分配一个名为 RoslynAnalyzer 的新标签。为此,在资源标签子菜单的 文本输入字段允许用户输入文本字符串的字段 更多信息
请参阅 词汇表 中键入 RoslynAnalyzer
并按回车键。此标签必须完全匹配,并且区分大小写。创建后,标签将从那时起出现在资源标签子菜单中。您可以单击菜单中的标签名称将其分配给其他分析器。
控制台将打印一条警告,因为此源代码生成器将被注入多个程序集。解决方案是使上述示例中的 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);
}
}
将此脚本添加到场景中的 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路点等等。游戏对象的功用由附加到其上的组件定义。 更多信息
请参阅 词汇表,并进入播放模式。源代码生成器发出的消息将出现在 控制台窗口Unity 编辑器窗口,显示 Unity 或您自己的脚本生成的错误、警告和其他消息。 更多信息
请参阅 词汇表 中,包括时间戳。控制台还会出现一条警告,因为此源代码生成器将被注入多个程序集。解决方案是使上述示例中的 ExampleSourceGenerated
成为内部的,或者名称本身应该由生成器生成。
有关源代码生成器的更多信息,请参阅 Microsoft 的 源代码生成器文档。