参考链接:
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资源(默认目录为Assets\LuaFramework\Lua和Assets\LuaFramework\ToLua\Lua)
lua文件:先将这两个目录下的.lua文件转为.bytes文件,然后以文件夹为单位打包,例如Assets\LuaFramework\Lua\3rd\cjson下的会打包为lua\lua_3rd_cjson.unity3d,Assets\LuaFramework\ToLua\Lua\cjson下的会打包为lua\lua_cjson.unity3d,至于那些不在子文件夹下的,统一打包为lua\lua.unity3d。
非lua文件:复制到Assets\StreamingAssets\lua目录下
这里可以使用AssetBundleBrowser查看AB包情况
b.打包非lua资源
参考HandleExampleBundle,在实际开发中,不可能每增加一个资源就对应地添加一行打包代码(AddBuildMap),因此要处理一下。
先将AppConst.ExampleMode设置为false,然后修改Game.lua,最后clear wrap & build res,运行后会报错,因为自带例子的资源没有被打包。在HandleExampleBundle中,会将Builds下的.prefab和Textures下的.png资源添加到打包列表,这里修改一下目录结构,将例子中的.prefab放到Assets\LuaFramework\Prefab目录,将例子中的.png放到Assets\LuaFramework\Texture目录,这样以后打包资源就可以统一处理了。
lua代码修改:
目录修改:
c#代码修改(其中WWW已经被弃用了,这里改为UnityWebRequest):
Packager.cs
ResourceManager.cs
四.加载 & 卸载
核心类:ResourceManager.cs
成员:
m_BaseDownloadingURL:加载路径的根目录。在pc平台上是Assets\StreamingAssets,在移动平台上是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,并且不在请求中时,则卸载这个包。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?