Unity3D中使用C#呼叫C++編寫的DLL
阿新 • • 發佈:2019-02-03
前言
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'; }
然後點選生成解決方案,就可以在“工程根目錄\x64\Release”路徑下看到生成的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工程根目錄\Assets\Plugins”目錄下。預設的時候Assets下是沒有Plugins資料夾的,需要自己建立。一切就緒後,可以執行程式,在控制檯顯示如下資訊,表示C#中初始化的資料已經在C++的DLL中被修改,即C#成功呼叫了C++的DLL。