前言
Unity3D是一款非常优秀的游戏引擎,可以使用C#作为脚本语言进行编程。但是有的时候我们需要运行一些第三方的程序,例如C++实现的一些算法。我们需要将C++的代码以DLL的形式嵌入到Unity3D的程序中。这时候就要用到C#调用C++ DLL的方法。本文给出一个最简单的调用方式,实现了一些简单数据类型的传递。
1 C++中DLL的生成
在Windows平台上,首先使用VisualStudio2013来创建一个C++的Win32控制台应用程序。工程名设置为TestDLL。
在应用程序设置向导中,选择应用程序类型为DLL。
由于我们使用的Unity3D分32位和64位,所以我们需要在配置管理器中设置与Unity一致的位数。我的Unity3D是64位的,所以我做了如下设置。
然后将下面的代码粘贴到TestDll.cpp中。
#include "stdafx.h" extern "C"_declspec(dllexport) void fun0(int &a) { a = 111; } extern "C"_declspec(dllexport) void fun1(int *b) { *b = 222; } extern "C"_declspec(dllexport) void fun2(int c[]) { c[0] = 333; } extern "C"_declspec(dllexport) void fun3(char *d) { *d = 'B'; }
然后点击生成解决方案,就可以在“工程根目录x64Release”路径下看到生成的TestDll.dll。
2 在Unity3D中调用C++的DLL
创建一个新工程和一个新场景,并创建一个脚本UseDll.cs。脚本的内容如下:
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class UseDll : MonoBehaviour { [DllImport("TestDll")] private static extern void fun0(ref int a); [DllImport("TestDll")] private static extern void fun1(ref int b); [DllImport("TestDll")] private static extern void fun2(int[] c); [DllImport("TestDll")] private static extern void fun3(ref char d); void Start () { //初始化a、b、c、d 几个数据 int a = 0; int b = 0; int[] c=new int[5]; for(int i=0;i<5;i++) { c[i] = -1; } char d = 'A'; //调用dll中的函数,对数据进行修改 fun0(ref a); Debug.Log(a); fun1(ref b); Debug.Log(b); fun2(c); Debug.Log(c[0]); fun3( ref d); Debug.Log(d); } void Update () { } }
将这个脚本绑定到摄像机上,并且要把上一步中生成的TestDll.dll拷贝一份放到“Unity工程根目录AssetsPlugins”目录下。默认的时候Assets下是没有Plugins文件夹的,需要自己创建。一切就绪后,可以运行程序,在控制台显示如下信息,表示C#中初始化的数据已经在C++的DLL中被修改,即C#成功调用了C++的DLL。