托管插件是使用 Visual Studio 等工具创建的托管 .NET 程序集。此类插件仅包含 .NET 代码,因此无法访问 .NET 库不支持的任何功能。但是,Unity 用来编译脚本的标准 .NET 工具可以访问托管代码。因此,托管插件代码和 Unity 脚本代码之间区别不大,唯一的区别是插件在 Unity 外部编译而成,因此源代码可能不可用。
通常,Unity 将脚本作为源代码文件保存在项目中,并在每次源代码更改时都会编译这些脚本。但是,您可以使用外部编译器将脚本编译为动态链接库 (DLL)。然后可以将 .dll 文件添加到项目中,并将该文件包含的类附加到游戏对象,就像普通脚本一样。编译后的 DLL 在 Unity 中称为托管插件。
在 Unity 中,使用脚本通常比使用 DLL 容易得多。但是,您可能想在代码中使用 Unity 不支持的编译器,或者在 .dll 文件中添加第三方 Mono 代码,或者您可能想在没有源代码的情况下提供 Unity 代码。要突破这些限制,最简单的方法是创建一个 .dll 文件并将该文件添加到 Unity 项目。
要创建托管插件,必须创建一个 DLL,因此需要一个适用于该 DLL 的编译器。并非所有能生成 .NET 代码的编译器都能保证与 Unity 协同工作,因此在使用编译器进行重要工作之前,应使用一些可用的代码来测试该编译器是否兼容。如果 DLL 不包含依赖于 Unity API 的代码,则可以使用适当的编译器选项将它直接编译为 .dll 文件。
如果确实想使用 Unity API,则需要将 Unity 自身的 DLL 提供给编译器。在 macOS 上,这些 DLL 包含在应用程序捆绑包中。要查看这些 DLL,请在计算机上查找 Unity.app
文件 (Applications/Unity/Hub/Editor/[版本号]/Unity.app
),然后右键单击 Unity.app
并选择 Show Package Contents。
在 macOS 上,Unity DLL 的路径为:
/Applications/Unity/Unity.app/Contents/Managed/UnityEngine
在 Windows 上,Unity DLL 的路径为:
C:\Program Files\Unity\Editor\Data\Managed\UnityEngine
UnityEngine
文件夹包含多个模块的 .dll 文件,您可以引用这些文件来获取所需的特定命名空间。此外,某些命名空间需要引用 Unity 项目中某个已编译的库(例如,UnityEngine.UI
),该库位于项目文件夹的目录中:
~\Library\ScriptAssemblies
用于编译 DLL 的具体选项将根据所使用的编译器而有所不同。例如,Mono C# 编译器 mcs
的命令行在 macOS 上可能如下所示:
mcs -r:/Applications/Unity/Unity.app/Contents/Managed/UnityEngine/UnityEngine.UIModule.dll -target:library ClassesForDLL.cs
在这个示例中,-r
选项指定要包含在构建中的库的路径,在本例中为 UnityEngine.UIModule
库的路径。-target
选项指定需要的构建类型;“library”一词表示 DLL 构建。最后,要编译的源文件的名称为 ClassesForDLL.cs
。编译器认定此文件位于当前工作文件夹中,但是如有必要,您可以使用完整路径指定该文件。生成的 .dll 文件出现在与源文件相同的文件夹中。
编译完 DLL 后,便可以像任何其他资源一样将 .dll 文件拖到 Unity 项目中。托管插件有一个折叠三角形,可用于显示库中的单独类。可以像普通脚本一样将从 MonoBehaviour
派生的类拖到游戏对象上。可以按常规方式直接从其他脚本中使用非 MonoBehaviour
类。
本部分将介绍如何使用 Visual Studio 构建和集成简单的 DLL 示例,以及如何为 DLL 准备调试会话。
打开 Visual Studio 并创建一个新项目。选择 File > New > Project__,然后选择 Visual C# > Class Library__。
提供新库的以下信息:
DLLTest
作为名称)。接下来,添加对 Unity DLL 的引用。在 Visual Studio 的 Solution Explorer 中打开 References 的上下文菜单,并选择 Add Reference。然后,选择 Browse > Select File。
在此阶段,请选择位于 UnityEngine
文件夹中的所需 .dll 文件。
对于此示例,请在 Solution Browser 中将类重命名为 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);
}
}
}
代码准备好后,请构建项目以便生成 DLL 文件及其调试符号。
在 Unity 中创建一个新项目,并将构建的文件 <project folder>/bin/Debug/DLLTest.dll
复制到 Assets 文件夹中。然后,在 Assets
文件夹中创建一个名为 Test
的 C# 脚本,并将脚本内容替换为以下代码:
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));
}
}
将此脚本附加到场景中的游戏对象并按 Play,随后 Unity 将在 Console 窗口中显示 DLL 代码的输出。
为了允许编译不安全的 C# 代码,请选择 Edit > Project Settings > Player。展开 Other Settings 面板,然后选中 Allow Unsafe Code 复选框。