6.逻辑串联

6.逻辑串联


6.1 知识点

创建一个Main脚本,用于控制加载界面的显示逻辑,挂载到场景中空物体

public class Main : MonoBehaviour
{
    void Start()
    {
        AssetBundleManager.Instance.LoadAssetBundleResourceAsync<GameObject>("loading_ui", "LoadingPanel", (panelObj) =>
        {
            // 只需要去设置加载界面相关的内容
            GameObject canvasObj = GameObject.Find("Canvas");
            panelObj.transform.SetParent(canvasObj.transform, false);

            // 在进行AB包热更新之前 可以先把AB包管理器中记录的相关AB包清理 这样再之后使用时才不会出问题 不然主包已经有记录
            AssetBundleManager.Instance.ClearAssetBundle();

            // 获取面板脚本 执行AB包相关的更新
            LoadingPanel panel = panelObj.GetComponent<LoadingPanel>();
            panel.BeginUpdate();
        });
    }
}

热更新项目中添加逻辑入口,删除之前生成的热更文件,重新生成后改成txt后缀,重新放入AB包中,打包,生成对比文件后上传

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class ILRuntimeMain
    {
        /// <summary>
        /// 热更逻辑主入口
        /// </summary>
        public static void StartILRuntime()
        {
            // 把逻辑丢给热更这边处理
            Debug.Log("热更逻辑执行");
        }
    }
}

LoadingPanel的AB包更新完毕回调中添加热更相关逻辑

// 第二:AB包更新完毕后 需要去处理ILRuntime初始化相关的逻辑
public void ABUpdateOverDoSomthing(bool isOver)
{
    if (!isOver)
    {
        infoTxt.text = "AB包下载更新出错,请检查网络连接或联系服务商";
        return;
    }

    infoTxt.text = "资源加载结束";

    // ILRuntime的初始化相关
    ILRuntimeManager.Instance.StartILRuntime(() =>
    {
        // ILRuntime相关内容加载结束 就可以执行游戏逻辑了
        infoTxt.text = "游戏初始化完毕";

        // 热更相关逻辑执行
        ILRuntimeManager.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "StartILRuntime", null, null);

        // 热更相关逻辑执行
    }, (info) => { infoTxt.text = info; });
}

直接运行可以看到是从服务器下载的热更AB包

发布空壳应用程序

进行打包应用程序,打包时注意也要注释 appDomain.UnityMainThreadID = Thread.CurrentThread.ManagedThreadId;,不然也会报错。发布应用程序后可以正常运行,正常从服务器下载。

热更新表现

修改登录面板UI

修改入口代码,重新生成AB包,重新上传到服务器后,进入发布后的应用程序,会从服务器下载最新的AB包,实现热更新

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class ILRuntimeMain
    {
        /// <summary>
        /// 热更逻辑主入口
        /// </summary>
        public static void StartILRuntime()
        {
            // 把逻辑丢给热更这边处理
            Debug.Log("热更逻辑执行");

            GameObject.Destroy(GameObject.Find("LoadingPanel"));

            AssetBundleManager.Instance.LoadAssetBundleResourceAsync<GameObject>("loading_ui", "LoadingPanel", (panelObj) =>
            {
                // 只需要去设置加载界面相关的内容
                GameObject canvasObj = GameObject.Find("Canvas");
                panelObj.transform.SetParent(canvasObj.transform, false);
            });
        }
    }
}

再次修改入口逻辑,打一个新的AB包,从AB包中加载资源。重新生成后上传,进入我们发布后的应用程序也能实现热更新。(默认Cube资源丢失是其他问题,不用管)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class ILRuntimeMain
    {
        /// <summary>
        /// 热更逻辑主入口
        /// </summary>
        public static void StartILRuntime()
        {
            // 把逻辑丢给热更这边处理
            Debug.Log("热更逻辑执行");

            // 删除加载界面(只是测试 所以比较粗暴)
            GameObject.Destroy(GameObject.Find("Canvas"));


            // 在场景上动态创建一个立方体
            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

            GameObject sphere = AssetBundleManager.Instance.LoadAssetBundleResource<GameObject>("gameobject", "Sphere");
            sphere.transform.position = Vector3.up;
        }
    }
}


6.2 知识点代码

Main

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        AssetBundleManager.Instance.LoadAssetBundleResourceAsync<GameObject>("loading_ui", "LoadingPanel", (panelObj) =>
        {
            //只需要去设置加载界面相关的内容
            GameObject canvasObj = GameObject.Find("Canvas");
            panelObj.transform.SetParent(canvasObj.transform, false);

            //在进行AB包热更新之前 可以先把AB包管理器中记录的相关AB包清理 这样再之后使用时才不会出问题 不然主包已经有记录
            AssetBundleManager.Instance.ClearAssetBundle();

            //获取面板脚本 执行AB包相关的更新
            LoadingPanel panel = panelObj.GetComponent<LoadingPanel>();
            panel.BeginUpdate();
        });
    }
}

LoadingPanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;

public class LoadingPanel : MonoBehaviour
{
    //进度条
    public Image imgPro;

    //当前加载信息说明
    public Text infoTxt;

    void Start()
    {
        imgPro.rectTransform.sizeDelta = new Vector2(0, 50);
        infoTxt.text = "资源加载中";
    }

    //第一:需要去更新资源服务器上的AB包
    public void BeginUpdate()
    {
        //第一个委托 是用于 AB包下载更新结束后 处理逻辑的
        //第二个委托 是用于 更新当前加载信息的
        AssetBundleUpdateManager.Instance.CheckUpdate(ABUpdateOverDoSomthing, (info) => { infoTxt.text = info; },
            (nowNum, maxNum) => { imgPro.rectTransform.sizeDelta = new Vector2(nowNum / maxNum * 1600, 50); });
    }

    //第二:AB包更新完毕后 需要去处理ILRuntime初始化相关的逻辑
    public void ABUpdateOverDoSomthing(bool isOver)
    {
        if (!isOver)
        {
            infoTxt.text = "AB包下载更新出错,请检查网络连接或联系服务商";
            return;
        }

        infoTxt.text = "资源加载结束";
        //ILRuntime的初始化相关
        ILRuntimeManager.Instance.StartILRuntime(() =>
        {
            //ILRuntime相关内容加载结束 就可以执行游戏逻辑了
            infoTxt.text = "游戏初始化完毕";

            //热更相关逻辑执行
            ILRuntimeManager.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "StartILRuntime", null, null);

            //热更相关逻辑执行
        }, (info) => { infoTxt.text = info; });
    }
}

ILRuntimeMain

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{    
    class ILRuntimeMain
    {
        /// <summary>
        /// 热更逻辑主入口
        /// </summary>
        public static void StartILRuntime()
        {
            //把逻辑丢给热更这边处理
            Debug.Log("热更逻辑执行");

            //删除加载界面(只是测试 所以比较粗暴)
            GameObject.Destroy(GameObject.Find("Canvas"));


            //在场景上动态创建一个立方体
            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);



            GameObject sphere =  AssetBundleManager.Instance.LoadAssetBundleResource<GameObject>("gameobject", "Sphere");
            sphere.transform.position = Vector3.up;
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏