有時候在開發遊戲時,我們會需要使用一些C#的library,這些套件並沒有做成unity package上架asset store。它可能是以NuGet package的形式發佈在https://www.nuget.org/ 上。
很不幸的,在Unity專案中,我們無法直接用一般的方式安裝這個NuGet package。如果你直接在terminal下以下指令,會發現NuGet會把檔案下載到奇怪的位置,並且讓你的專案出現大量的compile error。
// Error, 在專案根目錄安裝nuget package並不管用
$ nuget install Some.Nuget.Package
NuGet是Visual Studio裡的套件管理系統,而他預設你的專案架構也是Visual Studio的形狀,無法直接套用在Unity上。
因此我們需要手動取出相容於Unity .Net版本的Dll,並將其放入Plugins資料夾底下。哪一個.Net版本相容你的Unity專案呢?可以在 BuildSettings -> OtherSettings -> Api Compatibility Level 找到
接下來要做的事有以下幾件:
- 使用NuGet下載需要的package
- 從package底下相依的每個套件找出對應版本的dll
- 複製到Unity的Assets/Plugins底下
其中第1, 2步,在package相依很多其他package時會是一件麻煩的事,要一個一個找來下載,並且點開對應的資料夾一一複製dll。
所以我寫了一個簡單的Python腳本去代勞這件事
使用方式
假設今天我們要在Unity使用Google翻譯在NuGet上的套件, 先到Nuget官網找到該套件的頁面
將名稱複製下來(Google.Cloud.Translation.V2)
然後把Python腳本下載下來,在你的terminal/powershell下以下指令:
// macOS/Linux
$ python3 ./nuget_dll_copy.py Google.Cloud.Translation.V2// Windows10
$ py ./nuget_dll_copy.py Google.Cloud.Translation.V2
等它跑完後會在你執行腳本的路徑底下產生一個名為Google.Cloud.Translation.V2的資料夾,點開後會看到兩個資料夾
我們將exported_dll改成你喜歡的名字,然後複製到你Unity專案底下的Assets/Plugins資料夾,這樣就完成了!
如果你想要指定資料夾名稱或.Net的版本,可以參考下面的指令
// use custom path and .Net 4 as arguments.
$ python3 ./nuget_dll_copy.py Google.Cloud.Translation.V2 --nuget-path ~/Downloads/G_Source --output-path ~/Downloads/G_Output --dotnet-version net4
如果你偏好自己來手工處理的話,請參考以下文件:
疑難排解
Q:匯入dll至Unity專案後,出現了大量的紅字compile error
A:可能是你原本使用的Plugins跟新匯入的有重複,請根據error訊息,刪除其中一個。例如常見Newtonsoft.Json有兩個不同的版本存在專案中,將其中的一個Newtonsoft.Json.dll刪除可以解決。
Q:輸入指令時出現 command not found: python 或 nuget not found
如果你macOS的Python是透過Homebrew安裝的,那將指令中的python3改成python即可。
Q:Build在IL2CPP的平台會出錯
A:若你匯入的套件有使用到C#反射(Reflections)的話,Unity可能會誤將某些應該被引用的dll給剔除。原因是在IL2CPP模式下,為了減少包體大小跟build時間,Unity會將它認為沒用到的code給剔除,而使用反射的code Unity無法正確辨別是否為需要被踢除的code。可以參考Unity的官方文件瞭解細節。
解決方法有2種:1. 改使用Mono當Scripting Backend 2. 新增link.xml檔案,並手動將需要保留的Assembly列入檔案中
詳細步驟可以參考以下文章: