Unity插件分為兩種:托管插件(Managed Plugins)和本地插件(Native Plugins)。本文先來說說Unity中的托管插件,本地插件的文章留到下一篇文章再說。
有時候我們會有這樣的需求:給第三方公司提供Unity插件,而又不希望第三方看到具體代碼,這時就可以將核心代碼編譯成dll文件供第三方調(diào)用。或者說,同一個公司多個項目都用到某個模塊,則可以把該模塊封裝成dll,方便在不同項目之間共用和維護。
關(guān)于dll加密的問題,以后有機會了可以考慮寫點東西分享出來。
一、創(chuàng)建DLL
打開VS,選擇文件 -> 新建 -> 項目后打開新建項目對話框。接著操作如下:
點擊確定后,編寫如下代碼:
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創(chuàng)建并生成dll,至于操作步驟可以查看官網(wǎng)手冊。
二、導(dǎo)入DLL
將MyLib項目目錄下的bin/Debug目錄下的MyLib.dll文件拷貝到Unity項目的Plugins目錄下。這時,Unity控制臺報Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded的錯誤,報錯詳細信息如下:
這是因為我用的Unity版本是5.3.4f1,支持的.NET Framework的版本為3.5。而我創(chuàng)建的MyLib項目的默認.NET Framework 3.5版本為4.5.2。
選擇項目,然后右鍵選擇屬性 -> 應(yīng)用程序,將目標框架改為 .NET Framework 3.5或以下 ,如下圖:
接著重新生成一下dll文件,重新導(dǎo)入到Unity就行了。
三、調(diào)用DLL
在Unity新建一個TestDll的腳本,并掛到主攝像機上,腳本代碼如下:
using UnityEngine;
using System;
using MyLib; // 導(dǎo)入dll
public class TestDll : MonoBehaviour {
private string blogUrl = "http://www.lxweimin.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("寫這篇博客到現(xiàn)在的時間間隔:" + span.TotalDays);
}
}
注意,調(diào)用Dll中的方法一定要使用using語句引入導(dǎo)入到unity中的dll類庫。
四、導(dǎo)入Unity DLL
怎么導(dǎo)入Unity原生類庫呢?別急,接下來就說說怎么在自定義的dll類庫中調(diào)用Unity中的類。
首先選中項目,接著右鍵選擇添加 -> 引用后,彈出引用管理器,如下圖:
在應(yīng)用管理器界面點擊瀏覽按鈕,找到UnityEngine.dll文件點擊確認按鈕導(dǎo)入,如下圖所示:
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,然后導(dǎo)入到Unity中,接著修改Unity腳本TesDll,具體代碼如下:
using UnityEngine;
using System;
using MyLib;
public class TestDll : MonoBehaviour {
private string blogUrl = "http://www.lxweimin.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("寫這篇博客到現(xiàn)在的時間間隔:" + time);
}
void OnGUI()
{
GUILayout.Label(myBlog);
GUILayout.Label(time.ToString());
if(GUILayout.Button("Create Cube"))
{
MyClass.CreateCube();
}
}
}
運行后的效果圖如下:
源代碼放在了群共享中,想要源碼的可以加群:253999688
四、參考資料
如果本文有錯誤之處還請幫忙指出。
本文作者: Sheh偉偉
本文鏈接: http://davidsheh.github.io/2016/11/15/Unity插件之Unity調(diào)用C_Sharp編譯的DLL/
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協(xié)議。轉(zhuǎn)載請注明出處!