基于Lua的Unity热更解决方案 – 3.优化LuaFramework_UGUI解决方案
【LuaFramework_UGUI】
从分组策略、打AB包、出包、解包、更新、资源的加载与管理方面分析LuaFramework_UGUI框架。
·分组策略:(按逻辑实体分,Prefab和Texture按Panel打包
共用的贴图一个文件夹,单个prefab专用的贴图一个文件夹,
一个Panel一个文件夹,包含这个Panel所有的prefab
·打包:
按文件夹打包,指定目录
HandleLuaBundle() || HandleLuaFile():Lua文件是否打成AB包
HandleExampleBundle() :指定路径和AB包名
·出包:
一开始的资源和files文件都在StreamingAssets目录下, Resource下不放东西
·解包:(首次
移动端StreamingAssets文件夹是只读的,
Application.persistentDataPath是可读可写的
同时为了比较MD5值,将StreamingAssets里的文件解包(复制)到Persistent目录下
·更新:
服务器上放最新的AB包,没有版本的概念
files.txt文件记录了所有资源文件及其MD5值,
每次启动客户端的时候,先从服务器拉最新的files文件,查找files中的文件,如果能在本地找到,看MD5值是否相同,如果不同则删除本地文件,再下载最新的;如果找不到,直接下载最新的
·加载和资源管理:
ResourceManager
Dictionary<string, string[]> m_Dependencies 所有的依赖
Dictionary<string, AssetBundleInfo> m_LoadedAssetBundles 管理加载的AB包
Dictionary<string, List> m_LoadRequests 加载AB包请求
Load:ResMgr.LoadPrefab – LoadAsset – add LoadAssetRequest – OnLoadAsset
Unload:加载的资源会加一个组件LuaBehaviour,在Destroy的时候会Unload这个资源的AB包及其依赖
·优点:
1.Lua这边使用了纯MVC模式,阅读和管理成本低
2.ResourceManager自己实现了引用计数
·缺点:
1.每次运行都要打AB包,开发效率低
2.一堆有的没的第三方库,很多余
3.View都是单例,不好扩展
4.如果服务器上有删除的资源,本地不会删除
5.ResourceManager加载资源不支持异步
【LuaFramework_New】
首先感谢一波同桌大佬(๑•̀ㅂ•́)و✧
·分组策略:(需要让美术和程序同学有自己专属的文件夹,方便管理
1. 需要打包热更的有Scenes、Prefabs、Textures、Tables、Fonts、Audios、Lua、Atlas
2.把需要热更的文件夹都放在Resources目录下
3.美术同学需要管理的文件(模型,材质,shader等)都在Art文件夹下,按类型分
·打AB包:
准备好打包配置,
三种打包方式,All pack,Path pack,File pack
分别是一个文件夹下所有资源的打成一个包;一个文件夹下按文件夹打包;一个文件夹下按资源个体打包
(注意,打包时要先把Atlas文件夹移出来打成图集再放回去打AB包,因为他在Resources目录下不能打图集
·出包:(需要方便开发,Resource或AB可以选择
1.出Resource包的时候,直接Build就行
2.出AB包的时候,先把Resources目录下的文件按配置打包成AB包,放在StreamingAssets文件夹下,并生成files文件列表记录版本信息,然后把Resource文件夹下的文件清空,出包,再还原文件。
·解包:
首次安装的时候需要先把StreamingAssets下的文件解包到PersistentData文件夹下
·更新:(需要支持下载中断
1.服务器:version, files, assets文件夹
2.先下载version – 如果version不同,则进入热更 ->
下载files文件,与本地files文件对比得出需要热更的列表 ->
查看本地是否有temp差异表(如果更新中断,会保存上次已经更的东西,->
根据这两个差异表得出最终的差异表 ->
然后根据差异列表更新 ->
如果更新完整则更新本地version文件,删除temp差异表。
·加载和资源管理:(需要支持异步加载
1.AssetBundleManager: 管理AB包
Dictionary<string, WeakReference> m_kWeakRefList :储存加载的AB包
2.ResourceManager: 管理从Resource和AB包中加载出来的资源,并提供了统一Load接口
Dictionary<string, WeakReference> m_kWeakRefList :储存加载的Asset obj
*LoadAll:如果界面A用到BC,会把ABC打在一个AB包中,在加载A的时候,会把BC也加载到内存中,方便使用
*支持资源异步加载
·启动流程:
启动客户端 ->
Init Scene:Main.StartUp -> InitManagers
HotUpdateManager:解包,热更 -> OnResourceInited -> OnInitialize 起Lua
Lua这边起状态机管理场景和切换状态。
·优点:
1.统一了ResourceManager.Load接口,(使用者不用知道是从Resource还是AB包中加载
2.Lua这边采用了面向对象的思想,
3.Lua调C#,利于后期灵活修改加载流程
4.Lua起状态机控制流程,很完善
5.热更支持下载中断
6.ResourceManager加载资源支持同步和异步