Unity插件之Unity調(diào)用C#編譯的DLL

Unity插件分為兩種:托管插件(Managed Plugins)和本地插件(Native Plugins)。本文先來說說Unity中的托管插件,本地插件的文章留到下一篇文章再說。
有時候我們會有這樣的需求:給第三方公司提供Unity插件,而又不希望第三方看到具體代碼,這時就可以將核心代碼編譯成dll文件供第三方調(diào)用。或者說,同一個公司多個項目都用到某個模塊,則可以把該模塊封裝成dll,方便在不同項目之間共用和維護。

關(guān)于dll加密的問題,以后有機會了可以考慮寫點東西分享出來。

一、創(chuàng)建DLL


打開VS,選擇文件 -> 新建 -> 項目后打開新建項目對話框。接著操作如下:

新建項目.png

點擊確定后,編寫如下代碼:

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文件,操作如下圖:

build.png

提示:也可以用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的錯誤,報錯詳細信息如下:

error.png

這是因為我用的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中的類。
首先選中項目,接著右鍵選擇添加 -> 引用后,彈出引用管理器,如下圖:


添加引用.png

在應(yīng)用管理器界面點擊瀏覽按鈕,找到UnityEngine.dll文件點擊確認按鈕導(dǎo)入,如下圖所示:

引用管理器.png

Unity類庫在Mac上的路徑為Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll;在Windows上的路徑為Program Files\Unity\Editor\Data\Managed\UnityEngine.dll

接著,將項目中無用的類庫都移除掉,只保留用到的System和UnityEngine兩個類庫,如下圖:


引用.png

然后,修改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();
        }
    }
}

運行后的效果圖如下:


效果圖.png

源代碼放在了群共享中,想要源碼的可以加群:253999688

四、參考資料


Managed Plugins


如果本文有錯誤之處還請幫忙指出。


本文作者: 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)載請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內(nèi)容