Unity3d 基于xlua热更新实现系列三:生成AB包导出并实现AB包动态加载(资源半热更改)(含源码)

前言

之前一直在学习xlua的热更新,不过看了将近一个月的,略知一二了,但仿佛未形成体系,而且看再多,也不如动手实现一下。
遂打算实现一个完整体系热更新的demo,从编码、打包、服务器、下载、热更新等过形成整体的认知。并打算将整个过程进行记录,并分享给大家。
不过这只是个demo,仅以登录界面和场景作为热更新处理,且肯定不完美,有些地方实现方法不适合的地方也欢迎大家指出交流,该demo仅供参考,谨慎用于商业项目。
同时会将遇到的坑分享出来。

上两篇,我们实现了“登录功能熟悉lua重写C#(https://blog.csdn.net/qq_33789001/article/details/123580137)”和“Xlua脚本动态加载(半热更新)(https://blog.csdn.net/qq_33789001/article/details/123637629)”,实现了逻辑脚本可以动态更改,本篇文章实现资源的动态加载,通过AB包的形式实现该功能。

资源处理过程

这里就需要提前计划好包体内容和资源内容,特别需要动态使用的资源(音效、图片等)需要提前设置好ab包。

资源的整理

这里整理了节点的结构,将UI节点和场景节点分别放一个根节点。如图:
在这里插入图片描述

并将他们导出为预设(LoginPanel和LoginScene)。

AB包设置

我们根据上面两个预设,分别设置了ab包的名称:
在这里插入图片描述

包名会自动为全小写。

导出AB包

AB的导出,在我网上查阅很多是使用自己编写的导出包脚本,这里我们就使用插件AssetBundlesBrowser,下载地址,自行加载解压放到Editor目录。

通过Window > AssetBundles Browser打开导包工具的界面:

在这里插入图片描述

在Configure页面可以看到我们设置的ab包:
在这里插入图片描述

扫描二维码关注公众号,回复: 14189840 查看本文章

其中关联的资源会自动关联在内。

在Build页面选择好平台并设置导出路径,点击Build就可以生产ab包。
在这里插入图片描述

编写代码

加载ab包之前要加载主包(ABPacks),因为主包包含了各AB包的关联关系,先加载关联的资源AB包,再进行加载AB包。

加载AB包

    private void LoadAB(string abName) {
    
    
        if (mainAB == null)
        {
    
    
            mainAB = AssetBundle.LoadFromFile(Global.getABPath(mainABName));
            mainFest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        }
        AssetBundle ab = null;
        string[] dpds = mainFest.GetAllDependencies(abName);
        for (int i = 0; i < dpds.Length; i++)
        {
    
    
            ab = AssetBundle.LoadFromFile(Global.getABPath(dpds[i]));
            abDic.Add(dpds[i], ab);
        }
        if (!abDic.ContainsKey(abName))
        {
    
    
            ab = AssetBundle.LoadFromFile(Global.getABPath(abName));
            abDic.Add(abName, ab);
        }
    }

    //同步加载资源
    public Object LoadRes(string abName, string resName) {
    
    
        LoadAB(abName);
        Object obj = abDic[abName].LoadAsset(resName);
        if(obj is GameObject)
            return Instantiate(obj);
        else
            return obj;
}

这里我们先加载了主包,再查找AB包的关联资源并加载,然后再加载AB包,如果是GameObject直接实例化返回。

展示登录场景


    void ShowLogin() {
    
    
        ABMgr.GetInstance().LoadRes("loginscene", "LoginScene");
        GameObject loginUI = ABMgr.GetInstance().LoadRes<GameObject>("loginpanel", "LoginPanel");
        loginUI.transform.SetParent(UICanvas, false);
        loginUI.transform.localPosition = new Vector3(0, -16, 0);
        loginUI.transform.localScale = Vector3.one;
}

这里先加载了登录场景,然后加载了登录的UI。

验证效果

这是默认的效果:
在这里插入图片描述

我们增加一个球体在下方,然后新增个材质到球体,修改UI上的文字:

在这里插入图片描述

导出后,将资源放置Assets\HotUpdateRes\ABPacks,效果如下:

在这里插入图片描述

成功更新上了。

源码

https://download.csdn.net/download/qq_33789001/85030848
打不开说明暂未通过审核

坑点

1.记忆中Package Manager中可以找到 AssetBundles Browser,看网上也是这么说的,不过打死也没找到,最后是在github上找到的。

2.还有记得将OriginalRes拷至XXXX_Data文件夹下,我总忘记。。。。

猜你喜欢

转载自blog.csdn.net/qq_33789001/article/details/123716922