怎么给Unity写一个原生的插件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么给Unity写一个原生的插件相关的知识,希望对你有一定的参考价值。

参考技术A   unity可以导入其它语言编写(和编译)的代码,称为原生插件(Native Plugins)。今天为大家分享如何创建Unity原生插件。

  Unity中的托管和非托管插件

  连接不同的代码并非Unity首创的。若你是Windows用户,可能听说过DLL,动态链接库的缩写。与单机应用类似,它们是编译过的软件。不同的是,它们不能直接执行,因为它们是被专门设计为供其它应用使用的。

  Unity支持两种插件:托管(Managed)和非托管(Unmanaged)的。前者是用C#编写并编译为通用中间语言(CIL)的字节码语言。托管插件与C#脚本一样强大,且带有编译过的源码。非托管(或原生)插件,是使用其它语言编写的软件,典型是C++。它们在功能上几乎没什么限制,而且因为都被编译为机器码所以通常比传统的脚本要快。

  第一步:新建C++项目

  本例中,我用的是Visual Studio 2015;你可以选择任意IDE编译C++代码。首先创建一个非托管C++库也就是新建项目。打开Visual Studio,依次点击File | New Project ,选择Visual C++ | Win32 Console Application。

  在给项目命名后(本例中为TestDLL),确保将应用类型(Application type)设为DLL,附加选项(Additional options)下选择空项目(Empty project)。

  至此,Visual C++解决方案已经准备好,我们可以开始编写代码了。

  第二步:编写库

  C++代码通常分为两个文件。函数定义(头文件)和函数实现(实现文件)。实现文件为.cpp文件,放在ResourceFiles目录下,头文件为同名.h放在HeaderFiles目录下。本例中我们创建一个头文件和一个实现文件;实现文件将包含所有要保存到DLL的功能。可以在相应的文件夹上单击右键新建文件,然后依次选择Add(添加)>NewItem(新选项)。

  实现部分:TestDLLSort.cpp

  开始编码,实现给数组排序。

[AppleScript] 纯文本查看 复制代码?
010203040506070809101112 #include "TestDLLSort.h" #include <algorithm> extern "C" void TestSort(int a[], int length) std::sort(a, a+length);

  5~7行使用了algorithm 库里的数组排序函数std:sort。如果熟悉C++11就会知道。只增加了extern "C"块,必须用它将TestSort的引用导出到DLL。

  头文件:TestDLLSort.h

  实现文件中的定义必须与头文件保持完全一致。它必须包含TestSort原型也就是函数签名。

[AppleScript] 纯文本查看 复制代码?
123456 #define TESTDLLSORT_API __declspec(dllexport) extern "C" TESTDLLSORT_API void TestSort(int a[], int length);

  其余部分是创建DLL必须的代码。TESTDLLSORT_API可以是任意名字,用来标记所有的导出函数。在更复杂软件中,TESTDLLSORT_API应该根据需要绑定到 __declspec(dllimport) 上。但是在本例中,没有必要。

  第三步:编译

  最后一步是在Visual Studio中编译我们的DLL。请确保发布平台设置正确(32位或64位)。然后依次选择Build>Build Solution。

  在屏幕下方的控制台上会看到输出日志如下:

[AppleScript] 纯文本查看 复制代码?
0102030405060708091011121314 1>------ Rebuild All started: Project: TestDLL, Configuration: Release x64 ------ 1> TestDLLSort.cpp 1> Creating library C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.lib and object C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.exp 1> Generating code 1> All 30 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. 1> Finished generating code 1> TestDLL.vcxproj -> C:\Users\Alan Zucconi\Documents\Visual Studio 2015\Projects\TestDLL\x64\Release\TestDLL.dll ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

  若发现有警告如:warning C4273: inconsistent dlllinkage,这可能表示编译器不确定使用__declspec(dllimport) 还是 __declspec(dllexport)。若想为Unity创建原生插件,就使用后者。本回答被提问者采纳

我可以在 Unity 插件中包含 Mono DLL 和原生 iOS 静态库吗?

【中文标题】我可以在 Unity 插件中包含 Mono DLL 和原生 iOS 静态库吗?【英文标题】:Can I include a Mono DLL and a native iOS static library in a Unity Plugin? 【发布时间】:2017-02-15 10:30:44 【问题描述】:

Unity 手册中有一节解释了如何将资源导出为 Unity 包here

我想将两个文件一起导出为单个 Unity 包。一个是位于我的 Unity 项目中 Assets 文件夹顶层的 Mono DLL。另一个是原生iOS静态库,即.a文件,位于Assets/Plugins/iOS

我应该按照上面提到的 Unity 手册中的说明进行操作

    从菜单中选择Assets > Export Package…,打开Exporting Package对话框。 在对话框中,通过单击复选框来选择要包含在包中的资产,以便它们被选中。

如果我在 Unity 编辑器中看到 Mono DLL,这就是我在“导出包”对话框中看到的内容

但是,如果我在 Unity 编辑器中可以看到原生 iOS 插件,那么我在“导出包”对话框中看到的内容是这样的

我能否将这两个项目(Mono DLL 和本机 iOS 静态库)包含在一个 Unity 包中?怎么样?

【问题讨论】:

我从来没有用过unity,但是dll文件是windows特有的,所以我想这是不可能的...... Mono DLL 不是特定于 Windows 的 - 这部分是 Mono mono-project.com 的目的 【参考方案1】:

确保您要添加的文件在 Unity 编辑器中都不可见,然后从菜单中选择 Assets > Export Package... 以调出 Exporting Package 对话框。然后它应该显示所有可能包含的资产,像这样

【讨论】:

以上是关于怎么给Unity写一个原生的插件的主要内容,如果未能解决你的问题,请参考以下文章

unity插件怎么安装

Unity接入自定义插件-调用安卓原生震动

Unity 动画插件 DOTween 的简单使用

unity 从世界的方向给一个 gameobject 一个向下的力 怎么写? 瞬间的力 和 恒定力 都有最好呵呵

Unity 移动端怎么加载网络上的视频??拜托各位了 3Q

Unity3D 插件 SUIMONO_water 怎么用