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

2022-01-10 泰鬥社區

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

關於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創建並生成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。而我創建的MyLib項目的默認.NET Framework 3.5版本為4.5.2。
選擇項目,然後右鍵選擇屬性 -> 應用程式,將目標框架改為 .NET Framework 3.5或以下 ,如下圖:


接著重新生成一下dll文件,重新導入到Unity就行了。

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


添加引用.png

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

引用管理器.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,然後導入到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();

        }

    }

}

運行後的效果圖如下:

效果圖.png

Managed Plugins

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

注意:關注了泰鬥微信公眾號,想獲得《用Unity5做一款即時戰略遊戲》課程觀看權的童鞋,可以聯繫晴天(QQ:986671381)或Lisa(QQ:2109365042),他們會添加你到該課程中,感謝!

相關焦點

  • Unity Android Plugin開發指南
    後者用來封裝Android代碼,提供給Unity項目使用。jar放在Unity項目的/Assets/Plugins/Android中,Android插件的其他依賴也放在此處。封裝代碼可以是C#文件,或者dll文件,都放在/Assets中,若是dll,需在Unity C#工程中添加此dll依賴。
  • 漫步VR——Unity語音聊天室開發
    編譯Support包:unity可以很方便移植到多個平臺上,依賴的即是下載安裝對應unity版本的Support-for-Editor。官方插件包,在我們的工程下會生成OVR總目錄,看下其中包含的子目錄:Editor:包含了新增Unity編輯器功能的腳本。
  • 如何運用Unity製作VR全景漫遊?
    Unity5.3.1 X64: http://unity3d.com/cn/get-unity/download/archivePTGui[可選]: 把全景圖轉成6個立方小圖 http://www.ptgui.com/download.htmlGoogle VR SDK For Unity: https://github.com/googlevr
  • Unity腳本特效插件,讓你的天空與眾不同
    Enviro是用於在Unity中動態實現3A級天空及天氣氛圍的插件,支持在運行時調整天空設置並保存,可以根據系統時間或自動更新時間來實現真實世界的日夜循環。Enviro擁有高效高質量的天空盒著色器,並提供大量屬性對天空效果進行調整與自定義,可以基於太陽高度模擬真實世界的光照,還支持季節變換。Enviro支持桌面、主機、移動及VR平臺。
  • Unity腳本與編輯器工具,開發省時必備利器
    Rewired對於其它平臺則直接調用Unity的輸入系統,開發者也仍可使用Unity自帶的輸入系統來實現其它需求。Rewired提供以玩家為中心的輸入系統,非常適合多人聯機的遊戲,插件支持根據玩家上線或離線來智能分配控制器。根據玩家而非控制器來獲取輸入,以保證無論玩家使用何種控制器均能得到想要的結果。
  • unity篇(2):在Unity中協程的各種使用
    這樣說有點難懂,其實unity中的協程其實就是為一個方法開闢多個入口。我們來看看協程最基本的使用:通過"yield return"把方法停住,直到下一次你想調用這個方法的時間再從剛剛停止的地方繼續進行,就像做了一個計時器,實現了每五秒一次輸出。
  • 如何利用Unity快速搭建訓練機器人數字孿生?
    在參賽期間,我們為 OAK 設備創建了一個 Unity 插件,並且也想在 Unity 中為其製作一個數字孿生。OAK-D 的 Unity 數字孿生集成了一個虛擬的 3D 攝像機,其精確的模擬能力可用於收集合成數據。
  • Unity2018.3中文更新日誌詳解
    擴展連結:https://blogs.unity3d.com/2018/11/12/physics-changes-in-unity-2018-3-beta/垃圾回收控制添加了一個新的UnityEngine.Scripting.GarbageCollector腳本API(https://docs.unity3d.com/2018.3/Documentation/ScriptReference
  • Unity URP/SRP 渲染管線淺入深出【匠】
    SRP全稱為Scriptable Render Pipeline(可編程渲染管線/腳本化渲染管線),是Unity提供的新渲染系統,可以在Unity通過C#腳本調用一系列API配置和執行渲染命令的方式來實現渲染流程,SRP將這些命令傳遞給Unity底層圖形體系結構,然後再將指令發送給圖形API。
  • Unity人物隱身(半透明)處理
    unity官方mesh合併文檔當然只靠官方文檔並沒有什麼卵用,unity官方文檔的一貫風格,你們懂得~~我們還是要自己寫代碼,或者也可以使用像Mesh Baker這樣的現成工具實現,對於Mesh Baker的使用這裡就不累述了,有很詳細的文檔和例子。網格合併的同時還進行了材質合併,代碼在下一部分以前給出。
  • Unity可編程渲染管線系列(二)自定義著色器(HLSL和核心庫)
    這是不正確的,但是是獲取編譯著色器的最快方法。稍後我們將添加正確的空間轉換。這是通過視圖投影矩陣完成的,Unity通過float4x4 unity_MatrixVP變量提供了該視圖投影矩陣。添加它,然後完成轉換。
  • Unity實戰之炸彈人
    如果你想複習一下關於動畫的課程,請參考我們的 Unity 動畫入門(https://www.raywenderlich.com/category/unity)課程。Models: 包含了玩家、關卡和炸彈的模型,以及它們的材質Physics Materials: 包含了玩家的物理材質 —— 一種特殊材質,用於在物體表面添加物理屬性。在本教程中,將允許玩家毫不費力地移動,不會發生任何摩擦。
  • unity3d 筆記35-實例-掃雷-2
    這些參數,可以之後寫一個ui界面在遊戲內設置。初步的成功如下:現在要做右鍵點擊標記格子但是我發現了一個問題,unity沒有準確到右鍵點擊的事件
  • Unity實現UI信息跟隨場景移動縮放-海島奇兵2
    文字使用textMesh pro,這個插件在unity store免費下載。製作字體略有一點麻煩Unity3D插件之TextMeshPro字體資源的製作【Unity3d】Textmesh pro教程(一):介紹及製作Font Asset3500個常用中文字符.txt 連結:http://pan.baidu.com/s/1o7WA5aM 密碼:u8b8若把3500個常用中文字符和字母數字符號生成一個SDF字體文件,生成的文件是8.49M
  • 插件化開發利器--boost.dll
    boost.dll是什麼boost.dll提供了一套跨平臺操作動態連結庫的方法,相比使用系統api去操作動態連結庫,它使用起來更方便,也更安全。
  • Unity2020.1新功能探路:2D&設計師工具相關更新
    掃描識別上圖二維碼查看課程詳細內容2D默認模板工程2D默認模板工程已經更新了,現在默認包含多個預編譯好的正式版的2D package,包括2D Animation, Pixel Perfect, PSD Importer, Sprite
  • Unity高級知識點總結:性能優化與圖形渲染進階
    以及gameObject.SetActive、閉包調用、gameObject.name讀寫等等。2、通過Profiler查找熱點是什麼,針對性的進行優化。3、不要頻繁調用activeSelf=true。要先做好判斷,只在需要以及必要的時候調用。4、特效不用的時候,停掉ParticleSystem,然後把特效丟到很遠的地方,而不是active。
  • 實戰 用Unity快速開發太空飛機大戰(上)
    用unity動手先來試試一個簡單的太空飛機大戰吧。
  • 小技巧:在Ubuntu 14.04中重置Unity和Compiz設置
    重置Ubuntu 14.04中的Unity和Compiz打開終端(Ctrl+Alt+T),並使用以下命令來重置compiz:dconf reset -f /org/compiz/重置compiz後,重啟Unity:setsid unity此外,如果你想將Unity圖標也進行重置,試試以下的命令吧:
  • [TA]Unity Shader:半透明、渲染、透明度測試和混合...
    註:深度閾值和條件其實有多種,例如在unity中有如下幾種選擇。一般正常渲染會用默認的LEqual。有時需要做一些特殊的渲染,比如不按照真實遮擋關係渲染做渲染時才會用其他的選項。所以在unity的實際操作中,你就可以將符合透明度測試的物體設置到「AlphaTest」渲染序列【渲染序列見補充4】,並在shader中用clip函數手動判斷是否捨棄某一片元。