Lua脚本热更新方案
热更新,通俗点说就是补丁,玩家那边知道重启客户端就可以更新到了的,不用卸载重新安装app,相对于单机游戏,这也是网络游戏用得比较多的一个东西吧。
首先,大概流程如下:
Are You Ready?
Go!
luaFileList.json文件内容一般是lua文件的键值对,key为lua文件路径+文件名,value为MD5值:
1
2
3
|
{
"lua/main.lua" : "151b0dea5fcd207b1bf0a2d94218de76",
}
|
这个配置可以写工具导出来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public static void ExportLuaJson(string luaRootDir, string outputPath) {
if (System.IO.Directory.Exists(outputPath)) {
FileUtil.DeleteFileOrDirectory(outputPath);
}
Dictionary<string, string> luaList = new Dictionary<string, string>();
string[] allLuaList = System.IO.Directory.GetFiles(luaRootDir, "*", System.IO.SearchOption.AllDirectories);
for (int i = 0; i < allLuaList.Length; i++) {
string filePath = allLuaList[i];
if (filePath.EndsWith(".meta"))
continue;
if (filePath.Contains(".svn"))
continue;
if (filePath.Contains(".bak"))
continue;
if (filePath.Contains(".bat"))
continue;
if (filePath.Contains(".txt"))
continue;
if (filePath.Contains(".DS_Store"))
continue;
string luaFilePath = filePath.Replace("\\", "/").Replace(luaRootDir, "");
string luaFileMd5 = GetFileMD5(filePath);
luaList.Add(luaFilePath, luaFileMd5);
string toPath = filePath.Replace(luaRootDir, outputPath);
string toDirectory = System.IO.Path.GetDirectoryName(toPath);
if (!System.IO.Directory.Exists(toDirectory)) {
System.IO.Directory.CreateDirectory(toDirectory);
}
FileUtil.CopyFileOrDirectoryFollowSymlinks(filePath, toPath);
}
LitJson.JsonWriter writer = new LitJson.JsonWriter();
writer.PrettyPrint = true;
LitJson.JsonMapper.ToJson(luaList, writer);
System.IO.File.WriteAllText(outputPath + "luaFileList.json", writer.TextWriter.ToString());
}
|
上面用到的获取MD5的接口网上很多,这里就不写了哈。