【问题标题】:How to see the Auto Reference section on Plugin Inspector?如何查看插件检查器的自动参考部分?
【发布时间】:2019-01-09 22:41:54
【问题描述】:

在最新的 Unity 手册中

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

他们断言插件检查器

现在具有“自动参考”概念:

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

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

对我来说它看起来如何..

发生了什么事?

如何访问自动参考?

【问题讨论】:

  • 不是聪明人***,但您更新到 2018.3 或更高版本了吗?
  • 准确地说,2018.3 - 还尝试了 .2 和一些更早的版本。好问题。
  • 刚刚在 2018.3 上检查了 windows - 结果相同。自动参考未显示。虽然用一个空的 test.cpp 文件对其进行了测试,但不确定它是否需要任何可参考的东西才能工作。但我假设您的 libButtonPlugin 包含实际代码?明天会检查 2019 年,看看它是否出现在那里。
  • 2019 Beta版可以看到:)
  • @Aybe 我真的试过了,但没有出现! :/ 也许我犯了一个错误 - 会再试一次...

标签: unity3d


【解决方案1】:

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

编辑:我刚刚注意到有更多隐藏的 cmets,其中之一是 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 文件夹旨在与 native/unmanaged 插件一起使用,而不是托管)。

非托管/原生 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#) 插件确实auto reference 的选项,而非托管/本机 (cpp) dll 确实没有 具有该功能。现在我实际上不知道为什么会出现这种情况,因为在文档中找不到它。也许这是一个错误,也许它背后还有另一个原因。稍后我可能会在论坛上发帖要求更多说明。


作为额外的一点,我决定对这两个函数运行一个基准测试,令我惊讶的是,托管 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 repo here,其中包含我上面使用的项目。

【讨论】:

  • 感谢您。首先,我只是没有注意到它仅适用于新的 beta '19 ........
  • 这很奇怪。根据文档,它应该在 2018.3 aswel docs.unity3d.com/2018.3/Documentation/Manual/… 中工作。我明天看看。如果不是,则文档不正确
  • @Fattie 我刚刚在 18.3 中尝试了我的测试项目。我看到托管插件上的“自动参考”选项。这是在 Windows 版本上完成的(我认为你在 mac 上运行?)gyazo.com/ac83874f4b137bbaebc12952778527a3
  • 我已经在这里上传了项目github.com/RemyRM/Unity_AutoReference_test/tree/master也许你可以验证它是否适用于mac
  • 啊!你已经完全解决了,@remy_rm。事实上,这个特性只适用于 dll(Unity 称之为“托管插件”)。 - 你破解了它!
【解决方案2】:

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

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

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

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

团结(有时)指的是:

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

  • 本机插件(例如,一个实际的 iPhone 静态库,编译为 C)作为“非托管插件”。

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

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

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

Unity 正在尝试并尝试改进他们的漫画文档 - 还没有:)

【讨论】:

  • 对“自动参考系统仅适用于已编译的 dll”的小修正。应该是“ 自动引用系统仅适用于 managed dll。因为 dll 始终是一段编译后的代码,并且它是托管还是非托管(非托管也称为本机)dll 的规定是什么根据 dll 的原始语言。“插件”只是一个模棱两可的名称,可以引用统一脚本之外的任何代码源,而 dll 只是一种方式制作插件。chat.stackoverflow.com/rooms/186413/…(所以提示我为此主题创建聊天)
  • 是的,你是对的......很难用正确的方式表达出来! :)
  • 是的,这真是一团糟,而且统一的文档不清楚这一事实也无济于事!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多