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

时间:2019-01-06 16:10:26

标签: unity3d unity-native-plugins

在最新的Unity手册中

https://docs.unity3d.com/2019.1/Documentation/Manual/PluginInspector.html

他们断言插件检查器

现在具有“自动引用”概念:

enter image description here

因此,使用最新的Unity(甚至尝试.2等)

但是,无论我做什么,我都无法使它出现。我尝试过的每个Unity项目,甚至包括Unity示例,都没有该功能。

对我的感觉如何..

enter image description here

这是怎么回事?

如何访问自动引用?

2 个答案:

答案 0 :(得分:3)

tl; dr-“自动引用”仅适用于托管插件。那是一个用C#编写并编译的.dll文件。非托管插件(使用非C#语言编写的dll,非托管插件,无法自动引用)

edit:我刚刚注意到还有更多隐藏的注释,其中之一是Aybe提到它可用于托管DLL。

edit2:如果您希望项目进行测试,我可以上传它。


我想检查在编辑器中进行检查时托管和非托管DLL之间是否有差异(在Unity 2019中进行测试,但我认为2018年也是如此)。

我制作了以下两个DLL。 C#中的一种(托管)和CPP中的一种(非托管)。我向其中添加了一些简单的功能,以确保它不会由空的dll引起。

托管的C#插件

using System;

namespace TestDLLManaged
{
    public class TestDLLManaged
    {
        public static float Multiply(int a, float b)
        {
            return a * b;
        }
    }
}

将其编译为针对.Net 3.5框架的DLL(Unity 2018及更高版本支持4.x,但希望在安全方面进行播放),并将.dll文件放置在/ Assets /文件夹中(显然是Assets / Plugin文件夹旨在与本地/非托管插件一起使用,而不是托管)。

非托管/本地C ++插件

//header filer
#pragma once
#define TESTDLLMULTIPLY_API __declspec(dllexport)

extern "C"
{
    TESTDLLMULTIPLY_API float MultiplyNumbers(int a, float b);
}

//body
#include "TestDLLMultiply.h"

extern "C"
{
    float MultiplyNumbers(int a, float b)
    {
        return a * b;
    }
}

还将其编译为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确实确实没有功能。现在我实际上不知道为什么会出现这种情况,因为在文档中找不到该处。也许这是一个错误,也许背后还有另一个原因。稍后我可能会在论坛上发表一篇帖子,要求更多说明。


作为一个额外的决定,我决定对这两个函数进行基准测试,令我惊讶的是,托管C#插件实际上比cpp插件要更快

auto reference

结果:

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

Unmanaged multiply took 00:00:00.1078501 milliseconds


对于希望自己查看差异/实验的任何人,我制作了一个git-hub仓库here,其中包含我上面使用的项目。

答案 1 :(得分:1)

@remy_rm已很好地解决了这个问题

编译的c#dll(“托管插件”)确实具有自动引用功能

enter image description here

实际的本机插件(“非托管插件”)具有自动引用功能

enter image description here

事实上,这确实适用于PC和Mac:

enter image description here

团结(有时)是指:

  • c#作为dll编译为“托管插件”;他们(有时)指的是

  • 本地插件(例如,用于iPhone的实际静态库,它已编译为C)为“非托管插件”。

(然而,www上所有其他与Unity相关的文章通常将已编译的c#称为“ dll”,将本机插件称为“插件”。)

自动引用系统仅适用于已编译的c#..“托管插件”。

非常感谢@remy_rm花了几个小时解决这个问题。

Unity正在尝试并尝试改善其漫画文档-尚不存在:)