Unity3d 如何查看插件检查器上的自动引用部分?

Unity3d 如何查看插件检查器上的自动引用部分?,unity3d,Unity3d,在最新的Unity手册中 他们断言插件检查器 现在具有自动参考概念: 因此,使用最新的Unity,甚至尝试 然而,无论我做什么,我都不能让它出现。我尝试过的每一个Unity项目,即使是Unity示例,都不具备该特性 对我来说是什么样子 发生了什么事 如何访问自动参考?tl;dr-自动引用仅适用于托管插件。这是一个用C编写并从C编译的.dll文件。非托管插件dll是用非C语言编写的,是非托管的,不能自动引用 编辑:我刚刚注意到有更多的隐藏注释,其中一条是可能提到它适用于托管DLL 编辑2:如果你想

在最新的Unity手册中

他们断言插件检查器

现在具有自动参考概念:

因此,使用最新的Unity,甚至尝试

然而,无论我做什么,我都不能让它出现。我尝试过的每一个Unity项目,即使是Unity示例,都不具备该特性

对我来说是什么样子

发生了什么事


如何访问自动参考?

tl;dr-自动引用仅适用于托管插件。这是一个用C编写并从C编译的.dll文件。非托管插件dll是用非C语言编写的,是非托管的,不能自动引用

编辑:我刚刚注意到有更多的隐藏注释,其中一条是可能提到它适用于托管DLL

编辑2:如果你想让项目测试出来,我可以上传

我想在Unity 2019的编辑器测试中检查托管DLL和非托管DLL之间是否存在差异,但我认为2018年也是如此

我做了以下两个DLL。一个在C中为托管,一个在CPP中为非托管。我向它添加了一些简单的功能,以确保它不会由空dll引起

托管C插件

将其编译成一个DLL,目标是.Net 3.5 framework unity 2018和更高版本支持4.x,但希望安全起见,将.DLL文件放在/Assets/文件夹中。显然,Assets/Plugin文件夹用于本机/非托管插件,而不是托管插件

非托管/本机C++插件< /P> 还将其编译为dll,并将其放置在/Assets/Plugin文件夹中

我在DLLImportTest.cs中调用了这两个DLL,并执行了一个简单的计算,以确保两个DLL都已导入,并且运行正常

using static TestDLLManaged.TestDLLManaged;

public class DLLImportTest : MonoBehaviour
{  
    const float pi = 3.1415926535f;

    [DllImport("TestDLL", EntryPoint = "MultiplyNumbers")]
    public static extern float UnmanagedMultiply(int a, float b);

    // Use this for initialization
    void Start()
    {
        UnityEngine.Debug.LogFormat("validating unmanaged, expeceted result = 100: {0}", UnmanagedMultiply(10, 10f));
        UnityEngine.Debug.LogFormat("validating managed, expeceted result = 100:  {0}", Multiply(10, 10f));
    }
}
在编辑器中检查DLL时,托管C插件似乎有自动引用选项,而非托管/本机cpp DLL确实没有该功能。现在我不知道为什么会这样,因为在文档中找不到它。也许这是一个错误,也许背后还有另一个原因。稍后我可能会在论坛上发表一篇文章,要求更多的澄清

作为额外的一点,我决定运行一个基准测试two函数,令我惊讶的是,托管C插件实际上比cpp插件更快

 private void BenchMark()
{
    Stopwatch watch1 = new Stopwatch();
    watch1.Start();
    for (int i = 0; i < 10000000; i++)
    {
        UnmanagedMultiply(1574, pi);
    }
    watch1.Stop();
    UnityEngine.Debug.LogFormat("Unmanaged multiply took {0} milliseconds", watch1.Elapsed);

    Stopwatch watch2 = new Stopwatch();
    watch2.Start();
    for (int i = 0; i < 10000000; i++)
    {
        Multiply(1574, pi);
    }
    watch2.Stop();
    UnityEngine.Debug.LogFormat("Managed multiply took {0} milliseconds", watch2.Elapsed);
}
结果:

非托管乘法耗时00:00:00.1078501毫秒

托管乘法花费了00:00:00.0848208毫秒


对于任何希望自己查看差异/进行实验的人,我已经制作了一个git hub回购协议,其中包含了我上面使用的项目。

这个问题已经由@remy\u rm很好地解决了

编译的c DLL托管插件确实具有自动引用功能 实际的本机插件非托管插件没有自动引用功能 事实上,这同样适用于PC和Mac:

团结有时指:

c编译为dll作为托管插件;他们有时提到

本机插件是一个用于iPhone的实际静态库,由C编译为非托管插件

然而,www上所有其他与Unity相关的文章通常将编译后的c称为DLL,将本机插件称为插件

自动参考系统仅适用于已编译的c。。托管插件

非常感谢@remy_rm花费数小时解决此问题


Unity正在努力改进他们的漫画文档,但还没有做到:

不是一个聪明的***但是你是否更新到了2018.3或更高版本?确切地说,2018.3-也尝试了.2和一些早期版本。好问题。刚刚检查了2018.3版windows-结果相同。自动引用未显示。但是,使用一个空的test.cpp文件测试了它,不确定它是否需要任何可引用的文件才能工作。但我假设你的libButtonPlugin包含实际的代码?明天将查看2019,看看它是否出现在那里。在2019测试版中可以看到:@Aybe我确实尝试过,但它没有出现!:/也许我犯了一个错误-我会再试一次…谢谢你。首先,我没有注意到它只适用于新的beta'19……这很奇怪。根据文件,它也应在2018年3月起作用。我明天去看看。如果不是,文档是incorrect@Fattie我刚在18.3年试过我的测试项目。我在托管插件上看到了自动引用选项。这是在windows版本上完成的,但我认为您正在mac上运行?我已经在这里上传了这个项目,也许你可以验证它是否适用于Macah!“你已经完全解决了,”雷米说。事实上,这个特性只适用于Unity所称的DLL管理的插件。-你搞定了!对自动参考系统的一个小的修正仅适用于已编译的DLL。自动参考系统仅适用于托管dll。因为dll始终是一段已编译的代码
指示它是托管的还是非托管的非托管的(也称为本机dll)由dll的原始语言决定。插件只是一个模糊的名称,可以引用unity脚本之外的任何代码源,而dll只是制作插件的一种方法。所以提示我为这个主题创建一个聊天是的,你是对的。。。很难用正确的方式表达它是的,这是一个相当混乱的局面,而unity的文档不清楚这一事实也没有任何帮助!
using static TestDLLManaged.TestDLLManaged;

public class DLLImportTest : MonoBehaviour
{  
    const float pi = 3.1415926535f;

    [DllImport("TestDLL", EntryPoint = "MultiplyNumbers")]
    public static extern float UnmanagedMultiply(int a, float b);

    // Use this for initialization
    void Start()
    {
        UnityEngine.Debug.LogFormat("validating unmanaged, expeceted result = 100: {0}", UnmanagedMultiply(10, 10f));
        UnityEngine.Debug.LogFormat("validating managed, expeceted result = 100:  {0}", Multiply(10, 10f));
    }
}
 private void BenchMark()
{
    Stopwatch watch1 = new Stopwatch();
    watch1.Start();
    for (int i = 0; i < 10000000; i++)
    {
        UnmanagedMultiply(1574, pi);
    }
    watch1.Stop();
    UnityEngine.Debug.LogFormat("Unmanaged multiply took {0} milliseconds", watch1.Elapsed);

    Stopwatch watch2 = new Stopwatch();
    watch2.Start();
    for (int i = 0; i < 10000000; i++)
    {
        Multiply(1574, pi);
    }
    watch2.Stop();
    UnityEngine.Debug.LogFormat("Managed multiply took {0} milliseconds", watch2.Elapsed);
}