在Unity3D裡使用DLL,Unity3D使用DLL
開始第一篇的內容:首先,我們需要建立一個類庫項目,可以使用Visual Studio或者Monodevelop來做。我這裡是使用vs2012來建立: 選擇好項目類型、寫好項目名稱。 新產生的項目裡面預設有一個Class1類
可以通過在方案總管裡面進行重新命名改成自己想要的類名,比如我這裡改成了Math3D
然後寫一個簡單的靜態方法在裡面。這裡我寫了個最簡單的加法(Add)。也可以不寫靜態方法,寫出普通的public方法,用的時候new對象出來調用該方法也可以。這和正常的C#編程沒區別。
寫好之後,在資源管理員裡面選擇“產生”,那麼在項目的bin/debug 裡面就會看到dll檔案,比如我這個額項目就是AzhaoDll.dll
接下來在Unity3D裡面建立你需要的項目,把剛才的dll檔案隨便放到項目的Assets檔案夾裡面。關於這個dll檔案的存放位置,網上有些人說是必須放在外掛程式檔案夾裡面,其實是不需要的,放在任意位置它都能被識別出來。當然,按照良好的項目路徑習慣,我們建立一個專門放外掛程式的檔案夾來存放dll檔案,也是合理的。
然後在Unity3D裡面建立一個C#指令碼,寫一行簡單的代碼來調用我們剛才寫的Math3D.Add方法。
這時會發現Math3D類不能識別,我們using AzhaoDll命名空間
然後在Unity3D裡把指令碼掛到攝像機上,運行,可以看到列印出正確的結果了,這就證明了dll已經被成功調用了。
回顧剛才我們做的一些小細節,在類庫項目的Math3D類裡面。我們預設的使用了AzhaoDll命名空間。那麼假如我們不使用命名空間,或者使用其他的命名空間行不行?答案是可以的,命名空間可以任意的更改,如果不用命名空間,那麼在調用的時候就不需要using,如果使用了其他命名空間,對應的using其命名空間就行了。以下試試把命名空間刪掉: 那麼在Unity3D裡面調用就直接可以用了:
啟動並執行結果也是正常的:
當然,不太建議不使用命名空間,這樣做一個說明,是因為unity3D本身建立的指令碼預設沒有使用命名空間,只是想說明如果不想麻煩,直接把Unity3D沒有命名空間的指令碼直接拿來編譯也是可以的。
再次回顧細節,剛才我們使用的是原生的C#,假如我們需要在類庫項目寫調用Unity3D本身功能的方法怎樣辦呢?在Unity3D的安裝目錄Editor\Data\Managed裡面,找到UnityEditor.dll和UnityEngine.dll兩個檔案。 然後在類庫項目裡面添加引用,把這兩個dll添加進來 這時候,我們就可以在類庫項目裡面using UnityEngine來使用Unity3D的方法了,比如我們這裡簡單寫了個CreateGameObject方法,產生一個名字為“CreateByDll”的gameobject。
產生dll,放回Unity3D項目裡,我們就可以調用這個方法:
運行,看到這個叫做“CreateByDll”的物體產生出來了。 通過以上的說明,我們會發現其實產生自己的dll在Unity3D裡面用是很簡單的事情。我們還可以添加其他自己寫好的類進類庫項目,然後產生dll來使用。
最後說一下注意事項了。剛才產生的dll在Unity3D編輯器裡面基本上都是能用的,但不一定能通過編譯。有可能在編譯成exe或者apk等時會報錯。需要注意的是,類庫項目使用的.Net Framework版本。我自己的嘗試是,使用.Net 4.0以上版本發布的dll,在Unity3D裡面會編譯不通過。所以我們可以用2.0或者3.0之類的版本來發布。
還有一些情況是某些現成的dll動態庫是使用完整的.Net2.0來發布的,所以我們在編譯的時候有可能需要選擇完整的.Net 2.0來發布。
到了這一步,我們就可以把Unity3D的整個代碼檔案夾裡面所有的指令碼剪下到類庫項目裡面產生dll,然後放回Unity3D項目裡面。這樣別人就不能直接的編輯我們項目裡面的代碼了。不過dll本身是不安全的,別人可以很容易看到裡面的內容。