天天看點

Unity插件之Unity調用C#編譯的DLL

Unity插件分為兩種:托管插件(Managed Plugins)和本地插件(Native Plugins)。本文先來說說Unity中的托管插件,本地插件的文章留到下一篇文章再說。

有時候我們會有這樣的需求:給第三方公司提供Unity插件,而又不希望第三方看到具體代碼,這時就可以将核心代碼編譯成dll檔案供第三方調用。或者說,同一個公司多個項目都用到某個子產品,則可以把該子產品封裝成dll,友善在不同項目之間共用和維護。

關于dll加密的問題,以後有機會了可以考慮寫點東西分享出來。

一、建立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建立并生成dll,至于操作步驟可以檢視官網手冊。

二、導入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。而我建立的MyLib項目的預設.NET Framework 3.5版本為4.5.2。

選擇項目,然後右鍵選擇屬性 -> 應用程式,将目标架構改為 .NET Framework 3.5或以下 ,如下圖:

接着重新生成一下dll檔案,重新導入到Unity就行了。

三、調用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類庫。

四、導入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

四、參考資料

Managed Plugins

如果本文有錯誤之處還請幫忙指出。本文歡迎轉載,但轉載請注明出處:http://www.jianshu.com/users/fd3eec0ab0f2/latest_articles

作者:Sheh偉偉

出處:http://www.cnblogs.com/davidsheh/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.