[Unity热更新]LuaFramework02.框架流程

参考链接:

https://blog.csdn.net/lyh916/article/details/45021703

https://blog.csdn.net/lyh916/article/details/52161633

零.常用路径

1.Util.AppContentPath():游戏包资源目录,内部路径

Android:jar:file://" + Application.dataPath + "!/assets/"

IPhone: Application.dataPath + "/Raw/"

Windows或其他:Application.dataPath + "/StreamingAssets/"

2.Util.DataPath:数据目录,外部路径

移动平台:Application.persistentDataPath + "/luaframework/" 

调试模式下:Application.dataPath + "/StreamingAssets/"

Windows或其他:c:/luaframework/

注意:

Application.streamingAssetsPath(只读)

Application.persistentDataPath(可读可写)

一.c#层

1.框架入口在Main.cs中,执行StartUpCommand后会添加各种Manager

2.启动游戏后,GameManager会进行判断,如果这是游戏安装之后的第一次启动,那么就会进行释放资源的操作,然后再进行更新资源的操作;否则直接进行更新资源的操作。更新好后,会进行资源初始化,最后调用Game.lua中的OnInitOK方法,进入lua逻辑

释放资源:将StreamingAssets目录下的文件复制到Application.persistentDataPath下

更新资源:先将服务器上的files.txt下载到Application.persistentDataPath,然后将files.txt中记录的md5和本地资源的md5进行比较,如果本地资源缺少或者md5不相等,那么就会将本地资源删掉并从服务器上下载对应的资源

二.lua层

调用PromptCtrl.Awake,加载并创建PromptPanel,给界面挂上LuaBehaviour,在LuaBehaviour中,回调PromptPanel.lua的Awake、Start方法

三.打包

核心类:Packager.cs

成员:

maps:打包列表,打包时会对这个列表进行打包

接口:AddBuildMap(需要提供AB包名,资源后缀,资源所处文件夹)

将指定资源添加到打包列表

a.打包lua资源(默认目录为AssetsLuaFrameworkLua和AssetsLuaFrameworkToLuaLua)

lua文件:先将这两个目录下的.lua文件转为.bytes文件,然后以文件夹为单位打包,例如AssetsLuaFrameworkLua3rdcjson下的会打包为lualua_3rd_cjson.unity3d,AssetsLuaFrameworkToLuaLuacjson下的会打包为lualua_cjson.unity3d,至于那些不在子文件夹下的,统一打包为lualua.unity3d。

非lua文件:复制到AssetsStreamingAssetslua目录下

这里可以使用AssetBundleBrowser查看AB包情况

b.打包非lua资源

参考HandleExampleBundle,在实际开发中,不可能每增加一个资源就对应地添加一行打包代码(AddBuildMap),因此要处理一下。

先将AppConst.ExampleMode设置为false,然后修改Game.lua,最后clear wrap & build res,运行后会报错,因为自带例子的资源没有被打包。在HandleExampleBundle中,会将Builds下的.prefab和Textures下的.png资源添加到打包列表,这里修改一下目录结构,将例子中的.prefab放到AssetsLuaFrameworkPrefab目录,将例子中的.png放到AssetsLuaFrameworkTexture目录,这样以后打包资源就可以统一处理了。

lua代码修改:

目录修改:

c#代码修改(其中WWW已经被弃用了,这里改为UnityWebRequest):

Packager.cs

ResourceManager.cs

四.加载 & 卸载

核心类:ResourceManager.cs

成员:

m_BaseDownloadingURL:加载路径的根目录。在pc平台上是AssetsStreamingAssets,在移动平台上是Application.persistentDataPath

m_AssetBundleManifest:总清单文件

m_AllManifest:总清单文件中的所有AB包名字

m_Dependencies:key为AB包的名字,value为依赖的AB包的名字

m_LoadedAssetBundles:key为AB包的名字,value为加载后的AB包

m_LoadRequests:key为AB包的名字,value为对包内资源的请求

分为异步模式和同步模式。这里要说一下引用计数的问题,规则是,当包的请求被处理完一次后,引用计数加1;包被再次依赖时(从第二次开始算),引用计数加1。每次卸载时计数减1,减到0则从内存中去掉。

例如有A1A2A3三个包,A2A3依赖A1,那么A1的引用计数为2,A2的引用计数为1,A3的引用计数为1。当卸载A2时,A1的引用计数变为1,此时还会留在内存中,再卸载A3包,A1的引用计数变为0,A1包就自动被卸载了。

在异步模式下:

a.加载

接口:LoadAsset(需要提供AB包名和Asset名,先加载AB包的依赖包,再加载AB包,最后加载AB包内的Asset)

调用LoadAsset后,会把对AB包和Asset的请求放在m_LoadRequests中,如果对这个AB包的请求正在处理中,则将请求放入队列中;否则开始处理请求。如果这个AB包以及对应的依赖包都已经加载到内存中,那么就可以开始加载资源了,这时会对该AB包的所有请求进行处理;否则会先去加载包。

b.卸载

接口:UnloadAssetBundle(需要提供AB包名和是否彻底卸载,先卸载AB包,再卸载AB包的依赖包)

如果该AB包的引用计数<=0,并且不在请求中时,则卸载这个包。

原文地址:https://www.cnblogs.com/lyh916/p/10962409.html