Unity3D 热更新实战 1:基本框架及原理
ABSTRACT
个人项目笔记(2016 前后,LuaFramework + tolua# 时代)。记录 tolua# 的 C# 与 Lua 互操作要点、LuaFramework(PureMVC)的模块划分、ResourceManager 的 AssetBundle 加载与引用计数卸载机制,以及基于 files.txt + MD5 比对的热更新原理。
核心要点
- tolua# 互操作:C# 侧经 LuaState 执行 DoString/DoFile/Require,用 GetFunction/GetTable 取 Lua 函数与表;使用 wrap 前必须调用 LuaState.Start()。
- Lua 调 C#:点号访问静态成员与变量,冒号调用非静态方法(隐式传 self);
{}传数组;封装了 newObject/destroy/GetComponent 等便捷函数。 - LuaFramework 三层:基础模块(Util 封装 Mono 能力、AppFacade 入口、Base 基类、View/Manager)、Lua 模块(LuaManager/LuaLoader/LuaLooper/LuaEvent/LuaBinder/LuaBehaviour)、Manager 模块(ResourceManager/PanelManager/ThreadManager)。
- Unity 5 加载 AB 四步:命名打包 → 加载总 Manifest → 加载依赖 → 加载 AB 本体;m_Dependencies/m_LoadedAssetBundles/m_LoadRequests 三张表管理依赖、已加载包与资源请求。
- AB 卸载用引用计数:被加载一次 +1、被依赖一次 +1,Unload 时减 1,归零才真正从内存移除——A2/A3 依赖 A1 时 A1 计数为 2。
- PanelManager 流程:CreatePanel → 取 AB 中 xxxPanel → Instantiate 挂 UIParent → 加 LuaBehaviour → 触发 xxxPanel.lua 的 Awake。
- 热更原理:服务器按「版本号/平台」目录存放资源与 files.txt(版本号 + 文件名 + MD5 + 大小),客户端下载 files.txt 与本地 MD5 比对,更新有差异的文件;核心代码在 HotFixManager.cs。
- 开发期开关:LuaBundleMode=false 让 Lua 直接读文件便于调试;PC 平台通过改 Util.GetRelativePath 用 file:// 模拟移动端热更读取。
关键实体与概念
tolua#、LuaState、LuaFramework、PureMVC、LuaBehaviour、ResourceManager、AssetBundle、Manifest、引用计数、files.txt、MD5 比对、StreamingAssets、persistentDataPath
关联概念
来源回溯
- 原始文件:
raw/gamedev/unity3d热更新实战1-基本框架及原理.md(evernote/FW-游戏3研发技术 导入)
时效性评估
- 仍有效:AB 依赖管理、引用计数卸载、MD5 清单比对、调试/出包双模式开关等原理是资源热更的通用范式。
- 已过时:tolua# 与 LuaFramework 已停止维护,现代替代为 xlua / HybridCLR(见 Unity 热更新方案演进);手写 ResourceManager + files.txt 已被 Addressables / YooAsset 的增量构建与目录托管取代。