zoukankan      html  css  js  c++  java
  • [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,并且不在请求中时,则卸载这个包。

  • 相关阅读:
    java 抽象工厂模式简单实例
    java 工厂方法模式简单实例
    java 简单工厂模式实现
    tomcat管理页面上如何查看工程下的文件
    如何用Ecplise部署Web项目到tomcat中
    Servlet中操作文件
    ServletContext是什么
    model1模式变为mv模式,实现业务逻辑和画面的分离
    jdbc操作工具类
    Cookie技术随笔
  • 原文地址:https://www.cnblogs.com/lyh916/p/10962409.html
Copyright © 2011-2022 走看看