版本: 2022.3
语言: 英语
导入和配置插件
本地插件

托管插件

托管 插件在Unity外部创建的一组代码,用于在Unity中创建功能。在Unity中可以使用两种类型的插件:托管的插件(通过Visual Studio等工具创建的.NET程序集)和本地插件(特定平台的本地代码库)。 更多信息
术语表中查看
是您在Unity之外创建和编译的.NET程序集,以动态链接库(DLL)的形式,使用Visual Studio等工具。

这是一个与标准C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性并以任何您喜欢的方式响应用户输入。 更多信息
术语表中查看
不同的过程,它将Unity存储在您的Unity项目中Assets文件夹中的源文件中。Unity在更改时编译标准C#脚本,而DLL则是预编译的,不进行更改。您可以将编译的.dll文件添加到项目中,并以标准脚本相同的方式将其包含的类附加到 GameObjectUnity场景中的基本对象,可以表示角色、道具、风景、相机、航标等。GameObject的功能由附加到其上的组件定义。 更多信息
术语表中查看

有关C#中托管代码的更多信息,请参阅Microsoft的“什么是托管代码?”文档

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

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

  • 您想使用Unity不支持的自定义编译器。
  • 您想将第三方.NET代码添加到.dll文件中。
  • 您想向Unity提供代码,而不提供源代码。

此页面解释了您可以用于创建 托管插件一个由类似Visual Studio等工具创建,用于Unity的托管.NET程序集。 更多信息
术语表中查看
的一般方法,以及如何使用Visual Studio创建托管插件和设置调试会话。

创建托管插件

要创建托管插件,您需要创建一个DLL。为了做到这一点,您需要合适的编译器,例如

并非所有生成.NET代码的编译器都与Unity兼容,在对其进行重大工作时,您应该使用一些可用的代码来测试编译器。创建DLL的方法取决于DLL是否包含Unity API代码

  • 如果DLL包含Unity API代码,在编译之前您需要将Unity自己的DLL提供给编译器
    1. 查找Unity DLL
      • 在Windows上,前往: C:\Program Files\Unity\Hub\Editor\<版本号>\Editor\Data\Managed\UnityEngine
      • 在macOS
        1. 在您的计算机上找到Unity.app文件。macOS上Unity DLL的路径是: /Applications/Unity/Hub/Editor/<版本号>/Unity.app/Contents/Managed/UnityEngine
        2. 右键单击Unity.app
        3. 选择显示包内容
    2. UnityEngine文件夹包含多个模块的.dll文件。将其引用到您的脚本中,使其可用。某些命名空间还需要从Unity项目中对编译的库进行引用(例如,UnityEngine.UI)。在项目文件夹目录中找到它:~\Library\ScriptAssemblies
  • 如果DLL不包含Unity API代码,或者您已经使Unity DLL文件可用,请按照您的编译器文档编译.dll文件。您用于编译DLL的确切选项取决于您使用的编译器。以Roslyn编译器的命令行工具csc为例,在macOS上可能看起来像这样

csc /r:/Applications/Unity/Hub/Editor/<版本号>/Unity.app/Contents/Managed/UnityEngine.dll /target:library /out:MyManagedAssembly.dll /recurse:*.cs

在此示例中

  • 使用/r选项指定要包含在构建中的库的路径,在此案例中为UnityEngine库。
  • 使用/target选项指定所需的构建类型;“库”表示DLL构建。
  • 使用/out指定库的名称,在这种情况下为“MyManagedAssembly.dll”。
  • 添加要包含的源文件的名称。使用/recurse方法将当前工作目录及其子目录中所有以“ .cs”结尾的文件添加到其中。生成的.dll文件出现在源文件相同的文件夹中。

使用托管插件

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

  • 展开托管插件以查看库内的独立类。
  • 将继承自MonoBehaviour的类拖动到Game Objects上。
  • 从其他脚本中直接使用非MonoBehaviour类。
An expanded DLL with the classes visible
一个可以看到类的已展开DLL

使用Visual Studio创建DLL

本节解释了

  • 如何使用Visual Studio构建和集成简单的DLL示例
  • 如何为Unity中的DLL准备调试会话。

设置项目

  1. 打开Visual Studio,创建一个新的项目。
  2. 选择文件 > 新建 > 项目 > Visual C# > .Net Standard > 类库 (.NET Standard)
  3. 将以下信息添加到新的库中
    • 名称:命名空间(在此示例中,使用DLLTest作为名称)。
    • 位置:项目的父文件夹。
    • 解决方案名称:项目的文件夹。
  4. 使Unity DLL文件可用于您的脚本。在Visual Studio中,打开解决方案资源管理器的参考的上下文菜单,然后选择添加引用 > 浏览 > 选择文件
  5. 选择所需的.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文件(例如,<项目文件夹>/bin/Debug/DLLTest.dll)复制到Assets文件夹中。
  2. 在Assets文件夹中创建一个名为Test的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关于不安全代码的文档

导入和配置插件
本地插件