Unity3D 热更新实战 2:Lua 代码分析及工作流程说明
ABSTRACT
接实战 1 的项目笔记。借 PromptPanel/PromptCtrl 示例讲清 Lua 语言基础(函数是一等公民、table 引用语义)、LuaFramework 的 Lua 侧 MVC 分工,以及热更新「打包、解包、更新、加载」四步的完整工作流程。
核心要点
- Lua 函数是匿名值,函数名只是持有函数的变量:
function foo(x) end等价于foo = function(x) end;PromptPanel.Awake等价于PromptPanel["Awake"]。 - table 是引用语义:多个变量可引用同一 table,全部引用置 nil 后才被回收;
a.x与a["x"]等价,但a[x](x 为变量)是动态键。 - 无 local 声明的变量是全局变量,可跨 .lua 文件访问;View/Ctrl 在 Common/define.lua 中注册。
- Lua 侧 MVC:xxxPanel 维护控件引用(View),xxxCtrl 写逻辑(Controller),无数据时省略 Model;CtrlManager 统一管理所有 Ctrl,Game.lua 的 OnInitOK 指定入口面板。
- 新增一个面板的固定动作:加 xxxPanel + xxxCtrl,改 define、Game、CtrlManager 三处注册。
- Lua 使用 AB 资源两法:panelMgr:CreatePanel 与 resMgr:LoadPrefab(前者是后者封装),都要给 AB 包名、包内资源名、回调。
- 热更四步:打包(Packager.cs 把资源与 Lua 打入 StreamingAssets)→ 解包(移动端 StreamingAssets 只读,须复制到可读写的 persistentDataPath)→ 更新(下载 files.txt 比 MD5,差异即下载)→ 加载(先依赖后本体)。
- 发版策略:改资源发 1.2 时重新出包并上传 StreamingAssets 到服务器;1.1 用户走增量更新,1.2 用户解包即最新。
- 编辑器测试陷阱:作者屏蔽了 LuaState 的 InitPath,示例须手动 AddSearchPath(toluaDir/luaDir),否则可能「打包失败也能跑」的假正常。
关键实体与概念
Lua、table 引用、MVC、LuaBehaviour、CtrlManager、AssetBundle、StreamingAssets、persistentDataPath、files.txt、MD5、Packager.cs
关联概念
来源回溯
- 原始文件:
raw/gamedev/unity3d热更新实战2-lua代码分析及工作流程说明.md(evernote/FW-游戏3研发技术 导入)
时效性评估
- 仍有效:「StreamingAssets 只读 → 解包到 persistentDataPath」「先依赖后加载」「清单比对增量更新」至今是热更标准流程;Lua 语言要点长青。
- 已过时:LuaFramework/tolua 已停维护,现代走 xlua / HybridCLR;下载用 WWW/手动 files.txt 的方式已被 UnityWebRequest + Addressables/YooAsset 取代。