Unity插件分爲兩種:託管插件(Managed Plugins)和本地插件(Native Plugins)。本文先來講說Unity中的託管插件,本地插件的文章留到下一篇文章再說。
有時候咱們會有這樣的需求:給第三方公司提供Unity插件,而又不但願第三方看到具體代碼,這時就能夠將核心代碼編譯成dll文件供第三方調用。或者說,同一個公司多個項目都用到某個模塊,則能夠把該模塊封裝成dll,方便在不一樣項目之間共用和維護。html
關於dll加密的問題,之後有機會了能夠考慮寫點東西分享出來。app
1、建立DLL框架
打開VS,選擇文件 -> 新建 -> 項目後打開新建項目對話框。接着操做以下:dom
點擊肯定後,編寫以下代碼:ui
using System; namespace MyLib { public class MyClass { public static string GetBlogName() { return "Sheh偉偉的簡書"; } public static TimeSpan GetBlogTime(DateTime time) { return (time - DateTime.Parse("2016/11/14")); } } }
而後生成dll文件,操做以下圖:加密
提示:也能夠用MonoDeveloper建立並生成dll,至於操做步驟能夠查看官網手冊。spa
2、導入DLL插件
將MyLib項目目錄下的bin/Debug目錄下的MyLib.dll文件拷貝到Unity項目的Plugins目錄下。這時,Unity控制檯報Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded的錯誤,報錯詳細信息以下:3d
這是由於我用的Unity版本是5.3.4f1,支持的.NET Framework的版本爲3.5。而我建立的MyLib項目的默認.NET Framework 3.5版本爲4.5.2。
選擇項目,而後右鍵選擇屬性 -> 應用程序,將目標框架改成 .NET Framework 3.5或如下 ,以下圖:code
接着從新生成一下dll文件,從新導入到Unity就好了。
3、調用DLL
在Unity新建一個TestDll的腳本,並掛到主攝像機上,腳本代碼以下:
using UnityEngine; using System; using MyLib; // 導入dll public class TestDll : MonoBehaviour { private string blogUrl = "http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles"; void Start () { string myBlog = string.Format("{0}:{1}", MyClass.GetBlogName(), blogUrl); Debug.Log(myBlog); TimeSpan span = MyClass.GetBlogTime(DateTime.Now); Debug.Log("寫這篇博客到如今的時間間隔:" + span.TotalDays); } }
注意,調用Dll中的方法必定要使用using語句引入導入到unity中的dll類庫。
4、導入Unity DLL
怎麼導入Unity原生類庫呢?別急,接下來就說說怎麼在自定義的dll類庫中調用Unity中的類。
首先選中項目,接着右鍵選擇添加 -> 引用後,彈出引用管理器,以下圖:
在應用管理器界面點擊瀏覽按鈕,找到UnityEngine.dll文件點擊確認按鈕導入,以下圖所示:
Unity類庫在Mac上的路徑爲
Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll
;在Windows上的路徑爲Program Files\Unity\Editor\Data\Managed\UnityEngine.dll
。
接着,將項目中無用的類庫都移除掉,只保留用到的System和UnityEngine兩個類庫,以下圖:
而後,修改MyClass腳本,代碼以下:
using System; using UnityEngine; namespace MyLib { public class MyClass { public static string GetBlogName() { return "Sheh偉偉的簡書"; } public static TimeSpan GetBlogTime(DateTime time) { return (time - DateTime.Parse("2016/11/13")); } public static void CreateCube() { GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube); int random = UnityEngine.Random.Range(-5, 5); go.transform.position = new Vector3(random, random, 0); } } }
代碼編寫完成後,從新生成一下dll,而後導入到Unity中,接着修改Unity腳本TesDll,具體代碼以下:
using UnityEngine; using System; using MyLib; public class TestDll : MonoBehaviour { private string blogUrl = "http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles"; string myBlog; double time; void Start () { myBlog = string.Format("{0}:{1}", MyClass.GetBlogName(), blogUrl); Debug.Log(myBlog); TimeSpan span = MyClass.GetBlogTime(DateTime.Now); time = span.TotalDays; Debug.Log("寫這篇博客到如今的時間間隔:" + time); } void OnGUI() { GUILayout.Label(myBlog); GUILayout.Label(time.ToString()); if(GUILayout.Button("Create Cube")) { MyClass.CreateCube(); } } }
運行後的效果圖以下:
源代碼放在了羣共享中,想要源碼的能夠加羣:253999688
4、參考資料
若是本文有錯誤之處還請幫忙指出。本文歡迎轉載,但轉載請註明出處:http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles