托管插件是在 Unity 外部使用 Visual Studio 等工具创建并编译到动态链接库 (DLL) 中的 .NET 程序集。
此过程与标准 C# 脚本不同,Unity 将这些脚本作为源文件存储在 Unity 项目的 Assets 文件夹中。Unity 会在标准 C# 脚本发生更改时编译这些脚本,而 DLL 是预编译的,其不会发生更改。可以将编译的 .dll 文件添加到项目中,并以与标准脚本相同的方式将其包含的类附加到游戏对象。
有关 C# 中的托管代码的更多信息,请参阅 Microsoft 的什么是托管代码?文档。
托管插件仅包含 .NET 代码,因此无法访问 .NET 库不支持的任何功能。但是,Unity 使用的标准 .NET 工具可以访问托管代码来编译脚本。
在 Unity 中使用 DLL 时,必须完成比使用脚本时更多的步骤。但是,在某些情况下,创建 .dll 文件并将其添加到 Unity 项目可能会很有帮助,例如:
本页面介绍了可用于创建托管插件的一般方法,以及如何使用 Visual Studio 创建托管插件和设置调试会话。
要创建托管插件,需要先创建 DLL。为此,您需要合适的编译器,例如:
并非所有能生成 .NET 代码的编译器都能与 Unity 兼容,因此在使用编译器进行重要工作之前,应使用一些可用的代码来测试该编译器是否兼容。用于创建 DLL 的方法取决于 DLL 是否包含 Unity API 代码:
C:\Program Files\Unity\Hub\Editor\<version-number>\Editor\Data\Managed\UnityEngine
Unity.app 文件。在 macOS 上,Unity DLL 的路径为:/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine
Unity.app
UnityEngine 文件夹包含了许多模块的 .dll 文件。引用它们可以将其用于脚本。某些命名空间还需要引用 Unity 项目中的编译库(例如,UnityEngine.UI)。在项目文件夹的目录中找到:~\Library\ScriptAssemblies
如果 DLL 不包含 Unity API 代码,或者您已使 Unity DLL 可用,则请按照编译器的文档编译 .dll 文件。用于编译 DLL 的确切选项取决于所使用的编译器。例如,Roslyn 编译器 csc 的命令行在 macOS 上可能如下所示:
csc /r:/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine.dll /target:library /out:MyManagedAssembly.dll /recurse:*.cs
在此示例中:
/r 选项指定要包含在构建中的库的路径,在本例中为 UnityEngine 库。/target 选项指定所需的构建类型;“library”表示 DLL 构建。/out 指定库的名称,在本例中为“MyManagedAssembly.dll”。/recurse 方法可以将所有以“.cs”结尾的文件添加到当前工作目录和所有子文件夹中。生成的 .dll 文件出现在与源文件相同的文件夹中。完成 DLL 编译后,便可以像任何其他资源一样将 .dll 文件拖到 Unity 项目中。然后可以:
本节介绍了:
DLLTest 作为名称)。MyUtilities。using System;
using UnityEngine;
namespace DLLTest {
public class MyUtilities {
public int c;
public void AddValues(int a, int b) {
c = a + b;
}
public static int GenerateRandom(int min, int max) {
System.Random rand = new System.Random();
return rand.Next(min, max);
}
}
}
要在 Unity 中为 DLL 设置调试会话,请执行以下操作:
<project folder>/bin/Debug/DLLTest.dll)复制到 Assets 文件夹中。using UnityEngine;
using System.Collections;
using DLLTest;
public class Test : MonoBehaviour {
void Start () {
MyUtilities utils = new MyUtilities();
utils.AddValues(2, 3);
print("2 + 3 = " + utils.c);
}
void Update () {
print(MyUtilities.GenerateRandom(0, 100));
}
}
Unity 在控制台窗口中显示 DLL 中的代码输出
不安全 C# 代码是指能够直接访问内存的代码。它在默认情况下不会启用,因为编译器无法验证它是否会引入安全风险。
在执行以下操作时可能需要用到不安全代码:
要启用编译不安全 C# 代码,请选择编辑 (Edit) > 项目设置 (Project Settings) > 播放器 (Player) > 其他设置 (Other Settings) 并启用允许不安全代码 (Allow Unsafe Code)。
有关更多信息,请参阅 Microsoft 的不安全代码文档。