在最新的Unity手册中
https://docs.unity3d.com/2019.1/Documentation/Manual/PluginInspector.html
他们断言插件检查器
现在具有“自动引用”概念:
因此,使用最新的Unity(甚至尝试.2等)
但是,无论我做什么,我都无法使它出现。我尝试过的每个Unity项目,甚至包括Unity示例,都没有该功能。
对我的感觉如何..
这是怎么回事?
如何访问自动引用?
答案 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已很好地解决了这个问题
事实上,这确实适用于PC和Mac:
团结(有时)是指:
c#作为dll编译为“托管插件”;他们(有时)指的是
本地插件(例如,用于iPhone的实际静态库,它已编译为C)为“非托管插件”。
(然而,www上所有其他与Unity相关的文章通常将已编译的c#称为“ dll”,将本机插件称为“插件”。)
自动引用系统仅适用于已编译的c#..“托管插件”。
非常感谢@remy_rm花了几个小时解决这个问题。
Unity正在尝试并尝试改善其漫画文档-尚不存在:)