將C#的NuGet套件新增至Unity專案中

Cloud Lin
5 min readFeb 1, 2021

--

有時候在開發遊戲時,我們會需要使用一些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 找到

接下來要做的事有以下幾件:

  1. 使用NuGet下載需要的package
  2. 從package底下相依的每個套件找出對應版本的dll
  3. 複製到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

A:確認你的環境有安裝Python3NuGet CLI

如果你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列入檔案中

詳細步驟可以參考以下文章:

Using GCP NuGet Packages with Unity | by Jon Foust | Medium

--

--