天天看點

Unity加載Dll熱更新銜接架構

歡迎加入Unity業内qq交流群:956187480

qq掃描二維碼加群

Unity加載Dll熱更新銜接架構

原工程源碼下載下傳:https://download.csdn.net/download/qq_37310110/11143484

ios不支援反射更新,故此方案隻适用安卓,PC端設定模式 :  1.更新模式 2.不更新模式

本架構為銜接架構并非遊戲架構,接入後需要擴充到自己的遊戲架構裡

一.Main類編寫

入口函數,在更新模式下負責加載打成ab包後的Dll檔案,并調用DllManager的初始化函數

參考反射 方法調用:https://blog.csdn.net/qq_37310110/article/details/89515198

public class Main : MonoBehaviour
{
   public bool isUpdate = false;
    Assembly assembly;
    void Start()
    {
        if (isUpdate)
        {
            //更新啟動
            Debug.Log("更新啟動");
           StartCoroutine(LoadDll());
        }
        else
        {
            //正常啟動
            Debug.Log("正常啟動");
            gameObject.AddComponent<DllManager>().InitAssembly(isUpdate,null);
        }
    }
    IEnumerator LoadDll()
    {
        string path = Application.streamingAssetsPath + "/mydll";
        WWW www = new WWW(path);
        yield return www;
        AssetBundle bundle = www.assetBundle;
        TextAsset asset = bundle.LoadAsset("MyDLL", typeof(TextAsset)) as TextAsset;

        assembly = Assembly.Load(asset.bytes);
        Type type = assembly.GetType("DllManager");
        var com = gameObject.AddComponent(type);

        MethodInfo methodInfo = type.GetMethod("InitAssembly");
        methodInfo.Invoke(com, new object[] { isUpdate, assembly });
    }
}
           

二:Unity編寫

Unity加載Dll熱更新銜接架構

剛開始所有腳本都放在unity本地,模式設定為非更新模式,所有的元件添加都為動态添加。

這樣做我們可以在開發階段本地測試,測試沒問題再制作Dll檔案。

public class DllManager : MonoBehaviour
{
    public static DllManager Instance;
    public Assembly assembly;
    public bool isUpdate;
    void Awake()
    {
        Instance = this;
    }

    //初始化反射資源
    public void InitAssembly(bool isUpdate, Assembly assembly)
    {
        this.assembly = assembly;
        this.isUpdate = isUpdate;
        LoadMainView();
    }
    //加載主界面
    private void LoadMainView()
    {
        var mainView = Instantiate(Resources.Load("Panel")) as GameObject;
        mainView.transform.SetParent(GameObject.Find("Canvas").transform);
        mainView.transform.localPosition = Vector3.zero;
        AddCompotent(mainView, "MainUI");
    }
    //動态加載腳本
    public Component AddCompotent(GameObject entity, string compotentName)
    {
        if (isUpdate)
        {
            //反射加載
            return entity.AddComponent(assembly.GetType(compotentName));
        }
        else
        {
            //正常加載
            return entity.AddComponent(Type.GetType(compotentName));
        }
    }
}
           

三:Dll檔案制作

用VicrosoftStudio制作Dll

1.建立類庫項目

Unity加載Dll熱更新銜接架構

2. 右鍵解決方案進入屬性界面

Unity加載Dll熱更新銜接架構

普及.net framework版本差別  https://blog.csdn.net/qq_37310110/article/details/89514260

3.引入Unity的dll,右鍵引用,添加引用

Unity加載Dll熱更新銜接架構

在Unity的安裝路徑下找到UnityEngine.dll和UnityEngine.dll添加

4.把unityceshi測試好的腳本檔案拖到vs内

設定目前解決方案為啟動項,生成Dll後,把dll字尾改成bytes,為什麼要改後面說明,改好後拖到Unity,到此dll制作完成

Unity加載Dll熱更新銜接架構
Unity加載Dll熱更新銜接架構
Unity加載Dll熱更新銜接架構

四: 給dll檔案打AB包

 打包操作網上各種版本各種方法都有,後面可能會把我之前封裝好的打包方案記錄給 大家看,目前簡單打包即可。

Editor編寫打包腳本

[MenuItem("打AB包/Build Windows Resource", false, 13)]
    public static void BuildWindowsResource() {
        BuildAssetResource(BuildTarget.StandaloneWindows, true);
    }
    public static void BuildAssetResource(BuildTarget target, bool isWin) {
        string dataPath = "c:/DLLTest/";
        if (Directory.Exists(dataPath)) {
            Directory.Delete(dataPath, true);
        }
        if (!Directory.Exists(Application.streamingAssetsPath)) Directory.CreateDirectory(Application.streamingAssetsPath);
        BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.None, target);
     
    }
           

給dll檔案設定ab标簽:Dll檔案直接打包會失敗無效,改字尾名bytes即可

Unity加載Dll熱更新銜接架構
Unity加載Dll熱更新銜接架構

打包:

Unity加載Dll熱更新銜接架構

結束。

五:運作測試

更新模式跟非更新模式 運作結果正常一樣,說明沒問題;接下來改一下腳本邏輯做一下更新

:

Unity加載Dll熱更新銜接架構
Unity加載Dll熱更新銜接架構

 替換MainUI腳本重新生成dll,替換舊的dll

更新後運作結果

Unity加載Dll熱更新銜接架構

https://download.csdn.net/download/qq_37310110/11143484

版權聲明:歡迎加入qq交流群:956187480    https://blog.csdn.net/qq_37310110/article/details/83145193

歡迎加入Unity業内qq交流群:956187480

qq掃描二維碼加群

Unity加載Dll熱更新銜接架構

繼續閱讀