在 Unity 工程 (Project) 中使用 Mono DLL

通常,Unity 会在源发生变更时,将工程中的脚本作为源文件进行保存和编译。但是,它也可使用外部编译器将脚本编译为动态链接库 (DLL),然后可将生成的 DLL 添加至工程,并像普通脚本一样将其中的类附加至对象。

在 Unity 中使用脚本通常比使用 DLL 更简单方便,但可能需要访问第三方提供 的 DLL 格式的 Mono 代码。开发自己的代码时,可将代码编译到 DLL 并将其添加到 Unity 工程,即可使用 Unity 不支持的编译器(如 F#)。另外,可能需要提供 不含源的 Unity 代码(如资源商店 (Asset Store) 产品),DLL 可让您轻松完成此操作。

创建 DLL

要创建 DLL,首先需要一个合适的编译器。并非所有可生成 .NET 代码的编译器都与 Unity 兼容,因此,最好先使用一些可用的代码测试该编译器,再用它开展重要工作。如果 DLL 不包含依赖于 Unity API 的代码,只需使用相应的编译器选项将代码编译到 DLL。如需使用 Unity API,则要将 Unity 自带的 DLL 设置为与该编译器兼容。在 Mac 中,这些代码都包含在应用程序包中(可使用上下文菜单中的显示包内容 (Show Package Contents) 命令查看应用程序包的内部结构;右键单击或 ctrl+ 单击此 Unity 应用程序):

Unity DLL 的路径通常为

	/Applications/Unity/Unity.app/Contents/Frameworks/Managed/

... UnityEngine.dll 和 UnityEditor.dll 会调用这两个 DLL。

在 Windows 上,您可在 Unity 应用程序安装文件夹中找到 DLL。其路径通常为

	C:\Program Files\Unity\Editor\Data\Managed

...尽管其中的 DLL 名称与 Mac OS 上的 DLL 名称相同,

但用于编译 DLL 的确切选项将各不相同,具体取决于使用的编译器。例如,在 Mac OS 上,Mono C# 编译器的命令行 mcs 可能是这样的:-

	mcs -r:/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll -target:library ClassesForDLL.cs 

在这里,-r 选项指定版本中要包含的库的路径,本例中为 UnityEngine 库。-target 选项指定所需的版本类型;“library” 一词用于选择 DLL 版本。最后,要编译的源文件名为 ClassesForDLL.cs(这是以假设该文件位于当前工作文件夹下为前提,但如果需要,也可使用完整路径指定该文件)。如果一切进展顺利,生成的 DLL 文件不久后将作为源文件显示在同一文件夹下。

使用 DLL

编译完成后,只需像处理任何其他资源一样将 DLL 文件拖放至 Unity 工程。DLL 资源含有一个小三角符号,可用它来区分库中的单独类。从 MonoBehaviour 派生出的类也可像一般脚本一样拖放至游戏对象 (Game Objects)。非 MonoBehaviour 类可直接在其他脚本中照常使用。


含可视类的展开 DLL

MonoDevelop 和 Visual Studio 分步指南

通过本部分,您将了解如何使用 MonoDevelop 和 Visual Studio(这两者是最受欢迎的可生成 .NET 库的集成开发环境 (IDE))构建和集成简单的 DLL 示例,本部分还将介绍如何准备 DLL 的调试会话。

编写和构建 DLL

  1. 打开 MonoDevelop 或 Visual Studio。
  2. 在应用程序菜单上新建一个工程:
    • MonoDevelop:
      1. 在菜单上依次打开文件 (File) > 新建 (New) > 解决方案 (Solution)
      2. 选择 C# > 库 (Library)
    • Visual Studio:
      1. 在菜单上依次打开文件 (File) > 新建 (New) > 工程 (Project)
      2. 选择 Visual C# > 类库 (Class Library)
  3. 填充新库信息:
    • 名称 (Name) 即命名空间,本例中使用 “DLLTest”。
    • 位置 (Location) 即工程父文件夹所在位置。
    • 解决方案 (Solution) 名称 即工程文件夹的名称。
  4. 将引用添加至 Unity API:
    • MonoDevelop:
      1. 在解决方案 (Solution) 浏览器中打开(右击)引用 (References) 的上下文菜单,然后选择编辑 (Edit) 引用。
      2. 选择 .Net 程序集 (Assembly) 选项卡 > 文件系统 (File System) > 选择文件
    • Visual Studio:
      1. 在解决方案资源管理器 (Solution Explorer) 中打开(右击)引用 (References) 的上下文菜单,然后选择添加引用 (Add Reference)
      2. 选择选项浏览 (Browse) > 浏览 (Browse) > 选择文件
  5. 选择所需的 Unity API 文件:
    • MacOS:
      • <Applications>/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll
    • Windows:
      • <Program Files>\Unity\Editor\Data\Managed\UnityEngine.dll
  6. 在本例中,解决方案 (Solution) 浏览器将类重命名为 "MyUtilities",并使用以下代码代替其代码:

C#

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);
		}
	}
 }

  1. 最后,构建此工程以生成 DLL 文件及其调试符号。

在 Unity 中使用新建的 DLL

  1. 打开 Unity 并新建一个工程。
  2. 将构建文件 <project folder>/bin/Debug/DLLTest.dll 复制到 Assets 或子文件夹(例如 Plugins)
  3. 在本例中,在 Assets 中创建一个 C# 脚本,并命名为 “Test”,然后使用以下代码替换其中的内容:

C#

using UnityEngine;
using System.Collections;
using DLLTest;

void Start () {
	MyUtilities utils = new MyUtilities();
	utils.AddValues(2, 3);
	print("2 + 3 = " + utils.c);
 }

void Update () {
	print(MyUtilities.GenerateRandom(0, 100));
 }

  1. 最后,将脚本分配至场景中的对象(如主相机 (Main Camera)),然后运行此场景。您将在控制台 (Console) 窗口中看见输出。

设置 DLL 的调试会话

  1. 准备 DLL 的调试符号:
    • MonoDevelop:
      • 将构建文件 <project folder>/bin/Debug/DLLTest.dll.mdb 复制到 Assets(例如 Assets/Plugins/)
    • Visual Studio:
      1. 在命令提示符中执行 <Program Files>\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe,将 <project folder>\bin\Debug\DLLTest.pdb 作为参数进行传递
      2. 将已转换的文件 <project folder>\bin\Debug\DLLTest.dll.mdb 复制到 Assets(例如Assets\Plugins\)
  2. 打开 MonoDevelop 中的 "Test" 脚本,务必在工具 (Tools) 菜单 (Windows) 或 MonoDevelop-Unity 菜单 (MacOS) 中启用 Unity 的调试程序:
    • 加载项管理器 (Add-in Manager) > 安装的选项卡 (Installed tab) > Unity > 选择 Mono Soft Debugger Support for Unity > 启用 (Enable)

有关更多信息,请参阅调试程序页面。

Page last updated: 2013-06-27