前言
之前一直在学习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包:
其中关联的资源会自动关联在内。
在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文件夹下,我总忘记。。。。