🤔
持续更新
LuaFramework是基于UGUI+tolua的简单游戏框架
tolua作者:蒙哥,LuaFramework作者:骏擎
想了解更多tolua及luaframework相关,可以关注博客uLua/cstolua
tolua技术群:286510803 , tolua技术讨论群:434341400(已满) 543826216
此文更新于 2018/5/1 ,这里讲的部分方法是所对应的最新版本
LuaFramework热更新流程
- Main脚本调用启动函数Startup;
- 游戏管理器GameManager生成;
- GameManager调用CheckExtractResource函数,检查“数据目录”是否存在;
- 若“数据目录”不存在,说明是初次运行游戏,将“游戏包资源目录”的内容解压缩到“数据目录”;
- 若“数据目录”存在,检查是否需要从服务器下载资源,GameManager调用OnUpdateResource函数下载“网络资源地址”上的files.txt,然后与“数据目录”中文件的md5码做对比,更新有变化的文件;
- 更新完成后,GameManager调用OnResourceInited函数,启动Lua状态机,游戏开始。
- 调试:在Main.lua加入调试语句,在LuaManager的StartMain访问热更新增的Lua脚本,生成新打包的Prefab
AppConst类的UpdateMode设为true,则从指定服务器下载资源,否则从本地“数据目录”获取。LuaBundleMode设为true,则从AssetBundle解压Lua脚本,否则直接读取项目脚本。
可以打开AssetsLuaFrameworkEditorCustomSettings.cs看到所有可以供lua调用的类
添加新的Lua脚本到AssetBundle包
- 将Lua脚本存放到 Assets/LuaFramework/Lua 目录,因为,当按下LuaFramework-Build XXX Resources的时候,框架会自动将Assets/LuaFramework/Lua下的所有内容打成AssetBundle包,放在StreamingAssets下,可以发现,StreamingAssets文件夹下会有个Lua文件夹,里面放的就是Assets/LuaFramework/Lua在打包之后的结果
- 主要注意以下几点
1:打开StreamingAssets/Lua,会发现,这个文件夹下大致分为两部分,3rd文件夹,和一堆资源包
其中,资源包的命名特点是对应路径信息的,例如lua_3rd_cjson和lua_3rd_cjson.unity3d这一组资源包,他对应着的是LuaFramework/Lua/3rd/cjson里面的Lua文件,这组资源包就是这个文件夹下的lua文件打包出来的结果。
2:StreamingAssets/Lua文件夹下,除了资源包外,还有一个3rd文件夹,可以打开Assets/LuaFramework/Lua/3rd 目录,然后打开其中一个,例如cjson的文件夹,可以发现,这文件夹里除了一些lua文件,还有一些txt配置文件或说明文件,所以,这个StreamingAssets/Lua/3rd文件夹下,放的就是这些lua文件外的文件资源
3:综上所述,如果我们要打包一个自定义的Lua文件(不是框架提供的Main.lua文件)的话,那么我们完全可以先在Assets/LuaFramework/Lua这个文件夹下,自定义一个专门存放我们编写的Lua文件的文件夹,当打包出来后,会发现,StreamingAssets/Lua下会有一个自定义的文件夹名.unity3d的一组资源包。
4:更改Lua入口,不用框架提供给我们的Main.lua这个文件:找到LuaManger这个类,然后找到StartMain()这个方法,
只需要把lua.DoFile里面的参数修改为你自定义的lua文件名,然后LuaFunction main=lua.GetFunction(“Main”)这一行的括号内的参数,修改为作为入口且存在于你自定义的lua文件中的lua方法即可。
不管是不是自己定义lua入口文件,最好都放在Assets/LuaFramework/Lua下,不要再另外加文件夹,因为放在Assets/LuaFramework/Lua路径下的所有lua文件都会直接一同打包在lua.unity3d资源包中,而程序设置好就是去这个包里读取lua的入口文件,除非你会改动lua入口文件的读取路径。
5:可以读取多个lua文件:
创建新的AssetBundle包
- LuaFramework/Build XXX Resources 的功能全都写在了Assets/LuaFramework/Editor/Packager.cs,这个类中,以及跟随打包生成的 StreamingAssets/files 这个MD5校验码文件是如何生成,也是写在这个Packager.cs 文件中,所以,如果想打包一些此框架没提供的平台资源,可以到这个Packager 模仿增加对应的打包方法
打包函数的主体代码是 Packager.cs 中的 BuildAssetResource , HandleExampleBundle , AddBuildMap , HandleLuaBundle , HandleLuaFile 这五个方法
- BuildAssetResource进行资源文件夹刷新,并且根据AppConst类里静态布尔属性设置情况的不同,分别调用HandleExampleBundle , HandleLuaBundle , HandleLuaFile 函数
- HandleExampleBundle 作用是告诉使用者如何打包美术素材,框架格式是什么,如果有打包的美术资源,可以根据这个格式自定义一个方法,来进行打包,AddBuildMap 方法里第一个参数:打包出来的资源名字,这个名字是用 AppConst.ExtName (值为 unity3D )作为后缀名。第二个参数:要打包的资源原本的格式, *.XXX 代表所有这种格式的资源。第三个参数:次框架是对指定路径的文件夹进行整体打包操作的,所以,第三个参数是你要打包的资源位于项目哪个文件夹中
- 所以综上所述,如果你要打包美术资源,先在项目中创建一个专门存放你自己的美术资源的文件夹,然后在 Packager.cs 中新建一个函数,里面的代码复制HandleExampleBundle,然后修改 AddBuildMap 参数,在完成上述步骤后,因为你的项目打包出来之前会删掉框架提供的示例场景,所以要把 AppConst 中的 ExampleMode 设置为 false ,最后在 Packager.cs 加入如图else代码,调用你的自定义打包函数
- HandleLuaBundle , HandleLuaFile 这两个函数是告诉用户如何将 Lua 文件打包成 AssetBundle 的,通常状况下不建议修改,因为功能已经很齐全了,当然,如果你想将这种功能实现应用到如 Xlua 中,可以去查看这两个函数是如何写的。
热更新主要由三部分组成:
- C# 与 Lua 的互相调用机制
- Lua 文件的打包
- 网络传输,校验
XLua , ToLua , ULua… 只是提供了 C# 与 Lua 的互相调用机制,并没有提供其余两者的功能实现,所以如果自己想开发个基于如 Xlua 这样的热更新框架,可以参照这个基于 ToLua 的框架
使用框架对下载的资源进行加载
- 在此之前,你要明白为何这个框架可以让lua脚本访问到C#的类
当你按下Lua/Clear wrap Files 时,会有弹出框,按下确定框架就会自动生成一堆Wrap结尾的文件,这个自动生成的文件所对应的就是一个叫 AppConst 的类,而这个框架就是让 Lua 通过访问这些自动生成的 wrap 的类来达到访问 C#类的目的
接下来就是资源的加载与生成:
在ResourceManager类中,框架提供了三个重载LoadPrefab方法
其参数分别是:
- 要加载的AssetBundle包的名字
- 需要加载此包中哪些美术素材
- 回调方法(这个方法的参数列表有一个UnityEngine.Object[]类型的变量的,这个数组变量存的就是你所加载的美术资源)
Lua中调用:
1
2
3
4
5
6
7
8
9
10
11
12
13 function Main()
print("logic start")
LuaHelper = LuaFramework.LuaHelper
resMgr = LuaHelper.GetResManager
resMgr: LoadPrefab("myprefabs.unity3d", {"Sphere", "Cube"}, LoadAssetBundle)
end
function LoadAssetBundle(go)
for i = 0, go.Length - 1, 1 do
UnityEngine.GameObject.Instantiate(go[i])
--go是userdata类型,遍历的时候必须用Length去取得长度
end
end