接觸Unity 3D 時間不長,看到網上有人問怎么通過Unity來調用Dll,而且發現這個問題似乎是用unity的朋友並不熟悉DLL的使用造成的,正好我使用過C++,對DLL還比較熟悉,因此寫了一個小小的教程來談談unity的Dll調用方法。
1.創建DLL
困擾Unity人員的主要問題大概出於Dll不會生成。這個確實比較麻煩,我這里給出一個vs 2008中創建DLL的方法。
1)首先打開vs2008,當然2005或者2003也都差不多。我這里用的是2008.
在C++項目中選擇 Win32程序,然后在控制台程序或者win32程序任選一個。 寫上項目名字點創建。

2) 任選一個的原因是這里並不重要,重要的是下一步,創建以后會出現一下這個面板。 選下一步見如下選項:
注意,首先選DLL,證明我們這個程序是個dll項目。選“空項目”的目的是建一個計較干凈的DLL程序,里面的代碼都有我們手寫完成,這樣寫過什么我們都知道。

3)創建項目,這樣我們得到一個空項目,在這個項目中,除了幾個文件加以外什么也沒有,我們在文件夾上點右鍵,創建新項。在新項里面分別創建一個CPP文件和一個頭文件。

4)得到如下的兩個文件:起什么名字並不重要

5)以下是2個文件的代碼:DLL的生成要說起來也一大堆的知識,我這里簡單的說一下,dll的使用和生成用的宏不同,上面的代碼主要是區分在不同環境中該使用那個宏,如果不理解就不要管了,你們只需要改最下面的哪個函數就行了。
頭文件
/////////////////// DLL.h /////////////////////////////
- #if defined (EXPORTBUILD)
- # define _DLLExport __declspec (dllexport)
- # else
- # define _DLLExport __declspec (dllimport)
- #endif
- extern "C" int _DLLExport MyADD(int x,int y);
代碼文件
////////////////// DLL.cpp ////////////////////////////
- //宏定義
- #define EXPORTBUILD
- //加載頭文件
- #include "DLL.h"
- //設置函數
- int _DLLExport MyADD(int x,int y)
- {
- return x+y;
- }
這樣我們就生成了一個MyAdd()函數,傳入兩個數就會返回它們的和。 然后編譯這個程序,會出現下面的對話框,那就證明你成功了!然后再把這個DLL文件放在你的unity工程的assert的Plugins(如果沒有這個文件夾就手動創建一個)。

6) 在unity中創建一個C#腳本,調用我們剛剛生成的dll,在這里我們的DLL名字就叫DLL,所以寫的是[DllImport ("DLL")] ,如果你的名字是Test.dll,那就寫[DllImport ("Test")]
寫一個GUI按鈕上顯示運行的結果。
- using UnityEngine;
- using System.Collections;
- using System.Runtime.InteropServices;
- public class NewBehaviourScript : MonoBehaviour {
- [DllImport ("DLL")]
- private static extern int MyADD(int x,int y);
- int i = MyADD(5,7);
- // Update is called once per frame
- void Update () {}
- void OnGUI()
- {
- GUI.Button(new Rect(1,1,200,100),"this DLL i = 5+7, i is '"+i+"'");
- }
- }
運行通過就可以在界面上看到

7)輸出unity項目exe到目錄,然后在目錄中也添加Plugins目錄,把DLL文件也考進去,然后點運行,呵呵 成功了吧!
。
以上是unity 輸出exe到win32系統的情況,下來看一看如何在其他平台上調用DLL。
- using UnityEngine;
- using System.Runtime.InteropServices;
- class SomeScript : MonoBehaviour {
- // This tells unity to look up the function FooPluginFunction
- // inside the plugin named "PluginName"
- [DllImport ("PluginName")]
- private static extern int MyADD(int x,int y);
- void Awake () {
- // Calls the FooPluginFunction inside the PluginName plugin
- // And prints 5 to the console
- int i = MyADD(5,7);
- }
- }
由於沒有Android機器測試,不知道是不是可以用,不過官方文檔這么寫的,應該不是什么大問題。
參考文檔: http://game.ceeger.com/Manual/Plugins.html#AndroidPlugins
