Unity3D :托管插件

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

托管插件

托管插件是您在 Unity 外部创建和编译的 .NET 程序集,使用 Visual Studio 等工具将其编译为动态链接库 (DLL)。

此过程与标准 C# 脚本不同,Unity 将标准 C# 脚本作为源文件存储在 Unity 项目的“资产”文件夹中。Unity 会在标准 C# 脚本发生更改时对其进行编译,而 DLL 是预编译的,不会更改。您可以将已编译的.dll文件添加到项目中,并以与标准脚本相同的方式将其包含的类附加到游戏对象

有关 C# 中的托管代码的详细信息,请参阅 Microsoft 的什么是托管代码?文档。

托管插件仅包含 .NET 代码,这意味着它们无法访问 .NET 库不支持的任何功能。但是,Unity 用于编译脚本的标准 .NET 工具可以访问托管代码。

在 Unity 中使用 DLL 时,必须完成比使用脚本时更多的步骤。但是,在某些情况下,您可能会发现创建.dll文件并将其添加到 Unity 项目中会很有帮助,例如:

  • 您希望在代码中使用 Unity 不支持的编译器。
  • 你想要在.dll文件中添加第三方 .NET 代码。
  • 您希望在没有源代码的情况下向 Unity 提供代码。

本页介绍可用于创建托管插件的常规方法,以及如何使用 Visual Studio 创建托管插件和设置调试会话。

创建托管插件

要创建托管插件,您需要创建一个 DLL。为此,您需要一个合适的编译器,例如:

  • 视觉工作室
  • 女士构建
  • .NET 开发工具包

并非所有生成 .NET 代码的编译器都与 Unity 兼容,因此在使用编译器进行大量工作之前,应使用一些可用代码测试编译器。用于创建 DLL 的方法取决于 DLL 是否包含 Unity API 代码:

  • 如果 DLL 包含 Unity API 代码,则需要在编译之前使 Unity 自己的 DLL 可供编译器使用:
  1. 要查找 Unity DLL,请执行以下操作:
  • 在 Windows 上,转到:C:\Program Files\Unity\Hub\Editor\<version-number>\Editor\Data\Managed\UnityEngine
  • 在 macOS 上:
  1. 在计算机上找到该文件。macOS 上 Unity DLL 的路径为:Unity.app/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine
  2. 右键单击Unity.app
  3. 选择显示包内容
  4. 该文件夹包含多个模块的.dll文件。引用它们以使其可用于脚本。某些命名空间还需要引用 Unity 项目中的已编译库(例如 )。在项目文件夹的目录中找到以下内容:UnityEngineUnityEngine.UI~\Library\ScriptAssemblies
  • 如果 DLL 不包含 Unity API 代码,或者您已经提供了 Unity DLL,请按照编译器的文档编译.dll文件。用于编译 DLL 的确切选项取决于您使用的编译器。例如,Roslyn 编译器的命令行在 macOS 上可能如下所示:csc

csc /r:/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine.dll /target:library /out:MyManagedAssembly.dll /recurse:*.cs

在此示例中:

  • 使用该选项指定要包含在生成中的库(在本例中为库)的路径。/rUnityEngine
  • 使用该选项指定所需的生成类型;“库”表示 DLL 生成。/target
  • 用于指定库的名称,在本例中为“MyManagedAssembly.dll”。/out
  • 添加要包含的源文件的名称。使用该方法将当前工作目录和任何子文件夹中以“.cs”结尾的所有文件添加。生成的.dll文件将显示在与源文件相同的文件夹中。/recurse

使用托管插件

编译 DLL 后,可以将.dll文件拖到 Unity 项目中,就像任何其他资源一样。然后,您可以:

  • 展开托管插件以查看库中的单独类。
  • 将从 MonoBehavior 派生的类拖到游戏对象上。
  • 直接从其他脚本使用非 MonoBehavior 类。
具有可见类的扩展 DLL
具有可见类的扩展 DLL

使用 Visual Studio 创建 DLL

本节说明:

  • 如何构建一个简单的DLL示例并将其与Visual Studio集成
  • 如何在 Unity 中为 DLL 准备调试会话。

设置项目

  1. 打开 Visual Studio 并创建一个新项目。
  2. 选择“>新建>项目”> Visual C# > .Net Standard >类库 (.NET Standard)
  3. 将以下信息添加到新库中:
  • 名称:命名空间(对于此示例,用作名称)。DLLTest
  • 位置:项目的父文件夹。
  • 解决方案名称:项目的文件夹。
  1. 使 Unity DLL 可用于您的脚本。在 Visual Studio 中,在“解决方案资源管理器”中打开“引用”的上下文菜单,然后选择“添加引用”>“浏览”>“选择文件”。
  2. 选择所需的.dll文件,该文件位于 UnityEngine 文件夹中。

对 DLL 进行编码

  1. 对于此示例,请在解决方案浏览器中将默认类重命名为。MyUtilities
  2. 将其代码替换为以下内容:
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

要在 Unity 中为 DLL 设置调试会话,请执行以下操作:

  1. 在 Unity 中创建新项目,并将生成的.dll文件(例如 )复制到“资源”文件夹中。<project folder>/bin/Debug/DLLTest.dll
  2. 在“资产”文件夹中创建名为“测试”的 C# 脚本。
  3. 将其内容替换为一个脚本,该脚本创建您在 DLL 中创建的类的新实例,使用其函数并在控制台窗口中显示输出。例如,若要从上一节为 DLL 创建测试脚本,请复制以下代码:
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));
     }
}
  1. 将此脚本附加到场景中的游戏对象,然后单击播放。

Unity 在控制台窗口中显示 DLL 代码的输出

编译不安全的 C# 代码

不安全的 C# 代码是能够直接访问内存的代码。默认情况下不启用它,因为编译器无法验证它不会引入安全风险。

您可能希望使用不安全的代码执行以下操作:

  • 使用指针访问内存。
  • 分配原始内存。
  • 使用指针调用方法。

若要启用对编译不安全 C# 代码的支持,请转到“编辑>项目设置”>播放器>其他设置”,并启用“允许不安全代码”。

有关详细信息,请参阅 Microsoft 的不安全代码文档。

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :导入和配置插件 (mvrlink.com)

下一篇:Unity3D :原生插件 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号