怎么给Unity写一个原生的插件
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/50266889
作者:cartzhang
给Unity编写原生的插件
Untiy可以导入其他语言编写(和编译)的代码;他们叫做原生插件,本文将教你怎么构建他们。
· 步骤1:创建一个C++工程
· 步骤2:编写一个库
· 步骤3:编译
· 步骤4:导入Unity中
· 步骤5:在Unity中使用
· 结论
源代码:
· Visual Studio 2015 C++ 工程(DLL源码)
· Unity包(包含DLL)
Unity中托管和非托管插件
连接不同代码并不是Unity发明的。若你是Windows用户,你也许听说过DLL,动态链接库的缩写。与单机应用类似,他们是编译过的软件。不同的是,他们不能被直接执行,因为他们是专门设计要被其他应用使用的。
Unity支持两种插件:托管和非托管的。前者是代码用C#编写并编译为被称为通用中间语言(CIL)的字节码语言。托管插件与C#脚本一样强大,且带有编译过的源码。非托管(或原生)插件,是使用其他语言编写的软件,典型是C++。他们没有功能上并没有区别,因为他们都被编译为机器码,他们往往并传统的脚本要快。
步骤1:创建一个C++项目
本例子中,我使用的Visual Studio 2015;只要你知道怎么编译C++代码,你可以选择任何IDE。步骤1创建一个非托管C++库就是创建一个项目。打开Visual Studio,找到文件|新建工程,选择Visual C++ | Win32 控制台程序。
在给项目命名后(本例中为TestDLL),确保选择应用类型下的DLL,附加选项下的空项目。
至此,Visual C++解决方案已经准备好,我们可以开始编写代码了。
步骤2:编写库
C++代码通常分为两个文件。函数定义(头文件)和函数实现(实现文件)。实现文件为.cpp文件,放在Resource文件内,头文件为同名.h放在Header文件内。对于本例中我们创建一个头文件和一个实现文件;实现文件将包含所有我们要保存到DLL的功能。你可以通过单击右键创建一个文件在相应的文件夹上,然后选择添加|新选项。
实现:TestDLLSort.cpp
我们开始编码,给数组排序。
|
#include "TestDLLSort.h" #include <algorithm> extern "C" { void TestSort(int a[], int length) { std::sort(a, a+length); } } |
5~7行使用了数序库里的数组排序函数std:sort。如果你对C++11熟悉,这不是啥新鲜东西。只增加了extern "C"块,它对导出TestSort的引用到DLL中是必须的。
头文件TestDLLSort.h
实现定义,必须与头文件完全一致。它必须包含TestSort原型,它是函数实现的签名。
|
#define TESTDLLSORT_API __declspec(dllexport) extern "C" { TESTDLLSORT_API void TestSort(int a[], int length); } |
其他代码对于创建DLL是必须的。TESTDLLSORT_API是任意的,用来标记所有的导出函数。在更复杂软件中,TESTDLLSORT_API应该根据需要绑定到 __declspec(dllimport) 上。但是在本例中,没有必要。
步骤3:编译
最后一步是在Visual Studio中编译我们的DLL。请确保设置正确的发布平台(32位或64位)。然后,选择,编译|编译解决方案。
在屏幕下方的控制台上会看到输出的日志。如下所示:
|
>------ Rebuild All started: Project: TestDLL, Configuration: Release x64 ------ > TestDLLSort.cpp \Projects\TestDLL\x64\Release\TestDLL.exp > Generating code functions were compiled because no usable IPDB/IOBJ from previous compilation was found. > Finished generating code \Projects\TestDLL\x64\Release\TestDLL.dll skipped ========== |
若你发现有警告,比如:warning C4273: inconsistent dlllinkage,这可能意味着对不确定使用__declspec(dllimport) 和 __declspec(dllexport)。若你准备为Unity创建原生的插件,就使用后者。
步骤4:导入到Unity
根据前面编译日志,到工程文件中找到编译好的DLL。本例中,它在文件夹x64\Release中。这是你需要的唯一文件。在Unity中工作的第一步是把它拷贝到一个叫做的Plugins文件夹中。
原生插件通常与操作系统或平台相关。你可以使用右侧的检视板来确保每个DLL被包含。
步骤5:在Unity中使用
导入后,使用DLL相对简单。第一步是使用DLLImport定义入口。你需要指定DLL名和函数名。它会提供别名与其他函数一样可被调用。
|
using UnityEngine; using System.Runtime.InteropServices; public class TestDLL : MonoBehaviour { // The imported function [DllImport("TestDLL", EntryPoint = "TestSort")] public static extern void TestSort(int [] a, int length); public int[] a; void Start() { TestSort(a, a.Length); } } |
入口的字符串必须与C++库中的名字一样。但是,你可以使用如下方法调用函数;这个是以后C#怎么调用它的。
你应该注意到Unity在编辑器中不能检测非托管DLL;你必要运行游戏来检测是否成功连接。对于托管的DLL,则可以静态检测。
最后
原生插件非常重要,在游戏开发中扮演着重要角色。最大好处就是速度。C#脚本需要转换为CIL(通用中间语言),而非托管DLL被编译为机器码。你可以通过标记DLL创建自己测试。使用毫秒。快7倍啊!若你游戏有一些重度仿真(比如:动态液体或重度AI)你应该考虑那部分用C++库来编码。
其它资源
· 针对Mac机的原生插件:在这里包含关于更多文章内容,但是只针对Mac开发者。
· Unity and DLLs:一个为Unity创建托管C#和非托管插件的教程
· Writing plugins:Unity官方提供关于使用Visual Studio创建你插件的视频教程。
---------------
原文地址:http://www.alanzucconi.com/2015/10/11/how-to-write-native-plugins-for-unity/
说明:
本文是作者为蛮牛译馆翻译的文章!!
---------------
若有问题,请随时联系!
非常感谢!!!
怎么给Unity写一个原生的插件的更多相关文章
- 给Ionic写一个cordova(PhoneGap)插件
给Ionic写一个cordova(PhoneGap)插件 之前由javaWeb转html5开发,由于面临新技术,遂在适应的过程中极为挣扎,不过还好~,这个过程也极为短暂:现如今面临一些较为复杂的需求还 ...
- 用javascript写一个emoji表情插件
概述 以我们写的这个emoji插件为例,网上已经有一些相关的插件了,但你总感觉有些部分的需求不能被满足(如:可以自行添加新的表情包而不用去改源代码等等) 详细 代码下载:http://www.demo ...
- 如何写一个Js上传图片插件。
项目里面需要一个上传图片的插件,找了半天没有找到满意的,算了 不找了,自己写一个吧,顺便复习一下js方面的知识.完成之后效果还不错,当然还要继续优化,源码在最后. 介绍一种常见的js插件的写法 ; ( ...
- Skywalking-02:如何写一个Skywalking trace插件
如何写一个Skywalking trace插件 javaagent 原理 美团技术团队-Java 动态调试技术原理及实践 类图 实现 ConsumeMessageConcurrentlyInstrum ...
- 用原生js来写一个swiper滑块插件
是不是有点印象了,没错,他的最基本的用法就是左右滑动,插件使用者只需要写几行简单的html和js即可实现一个简单滑动效果,不过你完全可以组合各种元素来适应不同的场景. 当然插件我已经写好了,咱 ...
- 写一个Vue loading 插件
什么是vue插件? 从功能上说,插件是为Vue添加全局功能的一种机制,比如给Vue添加一个全局组件,全局指令等: 从代码结构上说,插件就是一个必须拥有install方法的对象,这个方法的接收的第一个参 ...
- 改变滚动条的原始样式: chrome 可以改变, IE只能变相关颜色,firfox好像也不好改。最好是自己写一个或是用插件
相关作者链接地址: https://www.lyblog.net/detail/314.html 问题: 1.我在项目中遇到的问题: 在设置了::-webkit-scrollbar 后,滚动条不见了! ...
- 用Unity写一个12306验证器的恶搞图生成软件
前言 前一阵子是买火车票的高峰期,然后12306的验证码就遭到各种吐槽.其实大部分验证码没有那么难,大家只是因为买不到票 发泄一下不满的情绪.于是各种恶搞的图就出现了,比如找二次元里人物的矮子,找好男 ...
- 玉渊潭赏樱花有感:从无到有写一个jQuery开源插件
“玉渊潭公园樱花节”是每年樱花绽放时,都会在玉渊潭公园樱举办樱花节,游客前往玉渊潭公园,可以欣赏到20个品种2000株樱花.2016玉渊潭樱花节时间:3月中旬-4月中旬观赏最佳,2016年3月23日开 ...
随机推荐
- C语言基本语法——函数
1.什么是函数 2.函数语法 3.函数声明 4.函数调用 5.函数的形参与实参 6.return与exit关键字 7.递归函数 1.什么是函数 • 函数就是一连串语句被组合在一起,并指定了一个名字 • ...
- vue自定义tap指令
1.Vue指令 Vue提供自定义实现指令的功能, 和组件类似,可以是全局指令和局部指令,详细可以参见vue官网自定义指令一节(https://cn.vuejs.org/v2/guide/custom- ...
- php获取时间是星期几
PHP星期几获取代码: date("l"); //data就可以获取英文的星期比如Sundaydate("w"); //这个可以获取数字星期比如123,注意0是 ...
- Css学习总结(2)——60个有用CSS代码片段
1.垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,可以很优雅的解决这个困惑: .verticalcenter{ position: re ...
- POJ 1671
其实求的是BELL数,即前N个第二类斯特林数的和. 一首诗有n行,每一行有一种韵律,问这首诗总共可能有多少种韵律排列.如4行,则所有的15种情况为:aaaa, aaab, aaba, aabb, aa ...
- 数据仓库工具:Hive
转载请标明出处: http://blog.csdn.net/zwto1/article/details/46430823: 本文出自:[明月的博客] 为什么要选择Hive 基于Hadoop的大数据的计 ...
- hdu 4544 湫湫系列故事——消灭兔子 优先队列+贪心
将兔子的血量从小到大排序,箭的威力也从小到大排序, 对于每仅仅兔子将威力大于血量的箭增加队列,写个优先队列使得出来数位价钱最少.. #include<stdio.h> #include&l ...
- struts2请求过程源代码分析
struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...
- Android上方便地开发的C程序
假设你基于没有一个专门的开发板练手.那你的Android手机也能够开发大多数C应用程序.安装好后编译C的编译器. 本文仅仅写一个Hello World的执行过程. 长处是:不须要eclipse,不须要 ...
- jq弹窗(获取页面宽高,滚轮高度,始终居中)
jq写一个弹窗,效果如上图所示, 点击按钮弹窗弹出,右上角关闭. 弹窗始终显示在页面中间,无论放大缩小窗口,滚轮滚动. 代码如下: html: <br><br><br&g ...