Unity导入C# DLL、C\C++ DLL 等外部库

发表于2018-01-05
评论0 7.5k浏览
本篇文章给大家记录了如何做一个简单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架构。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引