分享

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

 勤奋不止 2019-06-18

Untiy 导入C# DLL、C\C++ DLL、OSX BUNDLE、iOS Android 等插件。

参考官方教程:Writing Plugins

  网上已经有很多类似的了。这里作为自己的笔记,记录如何做一个简单DLL(Dynamic Link Library)动态链接库。
  创建使用环境为VS2015。


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架构。
这里写图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多