unity编程插件(unity插件怎么用)
如何编写Unity原生插件
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] 纯文本查看 复制代码?
#include "TestDLLSort.h" #include 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位)。然后依次选择BuildBuild Solution。
在屏幕下方的控制台上会看到输出日志如下:
[AppleScript] 纯文本查看 复制代码?
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
根据上面的编译日志,在工程文件中找到编译好的DLL。本例中,它在文件夹x64\Release中。我们只要这个文件。在Unity中使用它的第一步是把它拷贝到Plugins文件夹下。
原生插件通常与操作系统或平台相关。可以查看右侧的检视面板确保每个DLL被包含到正确的平台。
第五步:在Unity中使用
导入后,使用DLL就相对简单了。第一步是使用DLLImport定义入口(EntryPoint)。你需要指定DLL名和函数名。会提供别名让它可以像其它函数一样被调用。
[AppleScript] 纯文本查看 复制代码?
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,则可以静态检测。
Unity3d常用插件有哪些
1. NGUI,这个不用多说,上官网:
2. FingerGestures,顾名思义,这个是支持移动设备所有触摸事件的插件,包括点击,滑动,还有自定义手势等等,
3. EasyTouch,也是用于移动平台上的RPG类的游戏,这里有篇文章,简单介绍了一下该插件
4. ShareSDK,功能强大的分享插件,支持一键分享并且配置起来十分简单,目前绝大多数的社交软件都支持,并且他们官方的文档写得特别清楚而且如果注册用户的话,还会有技术支持,官方文档:
5. AndroidRemote,这个主要用于安卓平台和电脑联调,省去了每次测试都要重新打包的麻烦,
6. NGUI_HUD_Text,这个用于游戏里血条的变化
7. 2dToolKit,是一款2D开发组件,它具有很强的灵活性,可以让开发者在Unity中进行2D开发,
8. PlayerMaker,是一个可视化脚本工具,开发者可以使用它很快的完成游戏原型制作,能够大大的提高开发效率,让你的游戏更加完美,
9. PathologicalGames,用于绝大多数的曲线操作
10. FxMaker,侧重于unity里的粒子特效系统,这款插件提供了众多特效资源和效果预览,玩家可以随意组装效果并最终合成一个预设自己使用
11. Magical FX,魔法特效包
12. water.unitypackage,这是一款用于水的插件,性能还比较高,用于移动设备也没问题,弥补了专业版的unity水特效资源在移动设备卡机的不足
13. LitJson,看名字就知道,这是用于Json操作的一些API
14. icsharpcode-SharpZipLib,用于解压缩, ZipLib组件与.net自带的Copression比较,在压缩方面更胜一筹,经过BZip2压缩要小很多,而且这个功能更加强大。
15. unity-lzma,也是一款用于压缩和解压文件的库,它是一个开源的类库,有C、 C++、C#、JAVA的类库,Unity里面我们自然要使用C#的类库,
Unity插件之——Voxel Importer
? 最近在用magicavoxel建模,要导入Unity做绑骨,意外的发现了这个插件贼好用,写一个小的使用教程
首先导入插件。
创建一个空物体
挂载脚本?Voxel Skinned Animation Object
作用 :绑定体素骨骼,制作动画的前一步。
应用到动画对象。 它生成一个优化的网格。
脚本位置:?
Component/Voxel Importer/Voxel Skinned Animation Object
在voxel?file打开一个magicavoxel文件
在Setting——Import Offset选择Feet
然后选择骨骼(我下的插件有四种,具体是哪种试一试就知道了)
然后就可以开(tong)心(ku)的绑骨啦
调整好骨骼位置之后,选择各骨骼,开始设置骨骼的权重。
按下 “Edit Bone Weight” 按钮,开始设置骨骼的权重
Voxel模式下
voxel: 以体素一块一块的设置,
fill :自动选择填充相关部分
Rect :矩形选择,选择到的每个体素都是同一个权重值,配合Vertex使用。(常用)?
Vertex模式下
Brush :笔刷模式,直接设置某些顶点
Rect :矩形选择,会有比较好的过度。(常用)?
然后在各部位设置好就OK啦
Unity给力插件之MegaFiers
这是一个关于网格变形的插件。其中有非常多的功能。
这是它的API地址:
花了2天的时间实践并整理了其中绝大多数的功能,只有一些关于特殊格式的动画的功能没有实践,而且是比较重要的功能。
下面列举实践过的所有功能:
1.Bubble:气泡,呈现鼓出或萎缩的效果
2.Bulge:膨胀,可以控制不同方向上的膨胀量
3.conform:一致,让一个模型的某个方向与另一个模型表面贴合,例如在各种地形上贴合跑道模型
4.crumple:褶皱,类似噪音
5.curve deform:曲线变形,沿着一个轴线,设置一条曲线,模型按该曲线变形,勾选Use Pos,可以平移峰值
6.curve sculpt layered:自由变换,可以曲线控制任意方向上的变化(扭曲、膨胀等),自带区域限制,指定区域内才能变化
7.Cylindrify:圆筒,设置一个方向,模型按该方向圆筒化
8.displace:取代,在Map中置入灰度图,平面模型表面会根据明暗情况变得凹凸不平,其中Amount为程度值,Channel设置为不同通道
9.dynamic ripple:动态波纹,给平面添加该组件后,点击鼠标(从Main摄像机发射射线,没有MainCam时报错),生成波纹,Damping最大时点击处的受力面最大,Input Damping最大时波纹不恢复,Drops Per Sec为雨点;给模型添加Bouyancy New脚本,给Water设置参数,添加刚体,该模型就可以像浮木一样给水面造成波纹。
10.globe:地球,a、方方正正的对象呈现近大远小的效果;b、将房子贴合在弧形的地面
11.hump:驼峰,模型呈现峰谷变形,可以设置多个峰
12.melt:融化,各种融化效果(金属、冰、塑料、玻璃、果冻、自定义)
13.noise:噪音
14.pageflip:翻页
15.path deform:路径变形
16.pivot adjust:自定义中心,类似改变自身的Transfrom
17.point cache:要导入pc2、mdd、mc等格式的动画
18.push:推,朝面的法线方向往外膨胀或收缩,如果边缘未焊接则会分开
19.radial skew:射线倾斜
20.ripple:波纹
21.rope:绳索,模型添加组件后再添加2个空物体作为两端,可以用来做铁索桥、绳索等
22.rubber:橡胶,要用带VertexChannel的模型,不同颜色的通道在拖动时有不同情况的滞留效果,呈现duangduang的感觉
23.paint:画笔,运行时,通过Amount参数,使鼠标停留处模型鼓出或压下
24.simple mod:类似噪音
25.skew:倾斜
26.spherify:球形化,呈现QQ的感觉
27.squeeze:压紧
28.taper:细烛,锥形化
29.arc:圆弧,直接创建的路径对象
30.ellipse:椭圆
31.helix:螺旋
32.ngon shape:多边形
33.rectangle:矩形
34.star shape:星形
35.HOSE:软管,直接创建的模型对象
36.Attach:皮肤依附,模型添加该组件后,设置Target,目标移动时,模型始终依附在对象表面
在实践过程中经常会遇到一些问题:
1.复制的模型共用一个网格,后一个网格为主,其改变时,另一个模型的网格也会变化,前一个网格不可主动变化,否则会报错,需要使用MeshFilter.shareMesh替换;或者有个Copy object按钮可以用来复制,而且不影响原网格;
2.前一个模型的网格变化后,再变形另一个模型,则前一个模型的预制体的网格还原;
3.有些对象是空物体下面绑模型网格,注意区分,直接添加某些组件时无效;
4.有些模型需要有顶点通道,或者干脆就只能是特殊格式的模型