Unity中的托管和非托管插件
連接不同的代碼不是由Unity發起的。如果妳是Windows用戶,妳可能聽說過DLL,動態鏈接庫的縮寫。與獨立應用程序類似,它們是編譯軟件。不同的是,它們不能直接執行,因為它們是專門為其他應用程序設計的。
Unity支持兩種插件:托管和非托管。前者是用C#寫的字節碼語言,編譯成CIL。托管插件和C#腳本壹樣強大,並且附帶編譯過的源代碼。非托管(或本機)插件是用其他語言編寫的軟件,通常是C++。它們在功能上幾乎沒有限制,而且通常比傳統腳本更快,因為它們都被編譯成機器代碼。
步驟1:創建壹個新的C++項目
本例中我用的是Visual Studio 2015;;妳可以選擇任何IDE來編譯C++代碼。首先創建壹個非托管的C++庫,也就是創建壹個新的項目。打開Visual Studio,單擊“文件”|“新建項目”,然後選擇“visual c++| win32控制臺應用程序”。
命名項目(本例中為TestDLL)後,確保應用程序類型設置為DLL,並在Additional options下選擇壹個空項目。
此時,Visual C++解決方案已經準備好,我們可以開始編寫代碼了。
第二步:編寫庫。
C++代碼通常分為兩個文件。函數定義(頭文件)和函數實現(實現文件)。實現文件是壹個. cpp文件,放在ResourceFiles目錄下,頭文件同名。h放在HeaderFiles目錄中。在這個例子中,我們創建了壹個頭文件和壹個實現文件;實現文件將包含所有要保存到DLL的函數。您可以右鍵單擊相應的文件夾創建壹個新文件,然後選擇添加>;NewItem(新選項)。
實現部分:TestDLLSort.cpp
開始編碼,對數組進行排序。
[AppleScript]以純文本方式查看拷貝代碼?
010203040506070809101112 # include " testdllsort . h " # include & lt;算法& gtextern "C" { void TestSort(int a[],int length) { std::sort(a,a+length);} }
5 ~ 7使用了算法庫中的數組排序函數std:sort。熟悉C++11就知道了。只添加了外部“C”塊,必須使用它將TestSort的引用導出到DLL。
頭文件:TestDLLSort.h
實現文件中的定義必須與頭文件完全壹致。它必須包含TestSort原型,即函數簽名。
[AppleScript]以純文本方式查看拷貝代碼?
123456 #定義TESTDLLSORT _ API _ _ declspec(dllexport)extern " C " { TESTDLLSORT _ API void test sort(int a[],int length);}
剩下的是創建DLL所必需的代碼。TESTDLLSORT_API可以是標記所有導出函數的任何名稱。在更復雜的軟件中,TESTDLLSORT_API應該根據需要綁定到__declspec(dllimport)。但在這種情況下,沒有必要。
第三步:編譯
最後壹步是在Visual Studio中編譯我們的DLL。請確保發布平臺設置正確(32位或64位)。然後選擇“構建”>;構建解決方案.
在屏幕底部的控制臺上,您將看到如下輸出日誌:
[AppleScript]以純文本方式查看拷貝代碼?
010203040506070809101121314 1 & gt;-全部重新生成已開始:項目:TestDLL,配置:版本x64-1 & gt;testdllsort . CPP 1 & gt;正在創建庫C:\ Users \ Alan Zucconi \ Documents \ Visual Studio 2015 \ Projects \ TestDLL \ x64 \ Release \ TestDLL . lib和對象C:\ Users \ Alan Zucconi \ Documents \ Visual Studio 2015 \ Projects \ TestDLL \ x64 \ Release \ TestDLL . exp 1 & gt;生成代碼1 & gt;所有30個函數都被編譯了,因為在以前的編譯中沒有找到可用的IPDB/IOBJ。1 & gt;已完成生成代碼1 & gt;testdll . vcx proj-& gt;c:\ Users \ Alan Zucconi \ Documents \ Visual Studio 2015 \ Projects \ TestDLL \ x64 \ Release \ TestDLL . dll ========= =全部重建:1成功,0失敗,0跳過= = = = = = = = =
如果發現類似警告c4273:不壹致的DLLINGAGE的警告,則可能表示編譯器不確定是使用__declspec(dllimport)還是__declspec(dllexport)。如果妳想為Unity創建壹個本地插件,使用後者。
第四步:導入Unity
根據上面的編譯日誌,在項目文件中找到編譯好的DLL。在本例中,它位於文件夾x64\Release中。我們只想要這份文件。在Unity中使用它的第壹步是將其復制到Plugins文件夾中。
原生插件通常與操作系統或平臺相關。您可以檢查右側的視圖面板,以確保每個DLL都包含在正確的平臺中。
第五步:統壹使用
導入後,使用DLL就相對簡單了。第壹步是使用DLLImport定義壹個入口點。您需要指定壹個DLL名稱和壹個函數名稱。提供了壹個別名,以便可以像調用任何其他函數壹樣調用它。
[AppleScript]以純文本方式查看拷貝代碼?
0102030405060708091112131415161718181920使用UnityEngine使用系統。Runtime . InteropServices公共類TestDLL : MonoBehaviour { //導入的函數[DllImport("TestDLL ",EntryPoint = "TestSort")]公共靜態extern void TestSort(int [] a,int length);public int[]a;void Start() { TestSort(a,a . Length);} }
條目的字符串必須與C++庫中的名稱相同。但是妳可以用下面的方法來調用函數;以後C#也會這麽叫。
妳應該註意到Unity不能檢測非托管DLL在編輯器中;妳必須運行遊戲來檢查連接是否成功。對於托管dll,可以執行靜態檢測。