Unity导入C# DLL、C\C++ DLL 等外部库
发表于2018-01-05
本篇文章给大家记录了如何做一个简单DLL(Dynamic Link Library)动态链接库。下面就以创建使用环境VS2015为例,给大家介绍Unity导入C# DLL以及C\C++ DLL 等外部库的方法。
C# DLL
1. 创建类库文件,注意选择.NET最好不要大于3.5版本,因为Unity使用的mono版本为2.0,支持最多到.NET 3.5版本。
2. 如下图,创建一个MyRandomClass,包含一个公有方法GetRandom(),获取C#自带随机数获取函数。
3.编译生成.dll文件,地址看输出信息。
4.生成两个文件。
5.将其中.dll后缀文件直接拖入Unity项目中Assets\plugins目录,若无,自行创建。
6.随便给个GameObject添加如下C#代码文件,用于测试是否成功调用C#DLL。
7.运行三次,成功666。
C++ DLL
1.要注意一开始创建不是选DLL(通用Windows 8.1),那是用于Win 8.1和Windows Phone 8.1的。同样选择不大于.NET3.5的版本。
2.创建向导注意选DLL和空项目(如果需要其他也可以不选)。
3.代码如下,创建在源文件下。关于 __declspec(export)更多知识可以参考这里。这个功能是调用< algorithm>库里面std::max函数来返回两个整形最大值。
4.同样编译生成一堆文件。
5.同样只需要后缀为.dll的文件拖入项目。
6.同样在Assets\Plugins目录下。
7.测试脚本,需要声明DLL并带特性[DLLImport]。
8.测试两个值。
9.成功输出最大值。
.BUNDLE 等其他外部库
当需要适应多个平台,而且已经做好外部库,可以用下面的方法来根据平台而选中合适的外部库。可以直接在Unity的File->Build Settings选择平台来测试。选中的平台代码可以直接体现,在#if \ #enif语句正常显示的(非灰色的)。
using UnityEngine; using System.Runtime.InteropServices; //[DllImport]特性的命名空间。 public class TestScript : MonoBehaviour { public int x; public int y; #if UNITY_STANDALONE_WIN //WINDOWS系统 const string dll = "MyMaxNumberDLL"; #elif UNITY_STANDALONE_OSX //OSX(Mac)系统 const string dll = "MyMaxNumberBUNDLE"; #elif UNITY_IOS //IOS系统 const string dll = "__Internal"; #else //Android或其他 const string dll = " "; #endif [DllImport(dll)] private static extern int GetMaxNumber(int x, int y); public static int GetMax(int x,int y) { #if (UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || UNITY_IOS) return GetMaxNumber(x, y); #else return -1; #endif } private void Start() { Debug.Log(GetMax(x, y)); } }
遇到的错误
在使用C++的DLL时,出现了一个错误:“Failed to load ‘Assets/Plugins/MyMaxNumberDLL.dll’, expected x64 architecture, but was x86 architecture. You must recompile your plugin for x64 architecture.”在stackoverflow有人回答说需要多导入除了.dll文件的另外4个文件,但无果,又设置了Unity中Build Settings中windows平台的Architecture,但也无果。最后发现原来是C++ DLL编译生成时选择了x86,改成x64重新编译导入就好了。
需要选择x64架构。