代码之家  ›  专栏  ›  技术社区  ›  Fattie

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

  •  2
  • Fattie  · 技术社区  · 6 年前

    在最新的Unity手册中

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

    他们断言插件检查器

    现在有一个“自动参考”的概念:

    enter image description here

    所以使用最新的统一(甚至是尝试.2等等)

    但是无论我做什么,我都不能让它出现。我尝试过的每一个Unity项目,甚至Unity示例,都没有这个特性。

    它看起来怎么样……

    enter image description here

    怎么回事?

    如何访问自动引用?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Remy    6 年前

    tl;dr-“auto-reference”仅适用于托管插件。这是一个.dll文件,它是用C编写的。非托管插件(用非C语言编写的DLL是非托管的,不能自动引用)

    编辑:我刚注意到有更多隐藏的评论,其中一条可能是提到它在为托管DLL工作。

    伊迪丝2:如果你想让这个项目测试一下,我可以上传。


    在编辑器中进行检查时,我想检查托管和非托管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文件夹中。

    我调用两个dll的内部 DLLImportTest.cs 并执行一个简单的计算,以确保两个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)插件 有选择权 auto reference 以及非托管/本机(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);
    }
    

    结果:

    Unmanaged multiply took 00:00:00.1078501 milliseconds

    Managed multiply took 00:00:00.0848208 milliseconds


    对于任何希望自己查看差异/进行实验的人,我已经做了一个Git Hub回购 here 包含我上面使用的项目。

        2
  •  1
  •   Fattie    6 年前

    @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_称为“dlls”,而本机插件称为“plugins”。)

    自动参考系统仅用于编译C..托管插件”。

    非常感谢@remy_rm花费数小时来解决这个问题。

    Unity正在努力改进他们的漫画文档-还不完全是这样的:)