UE5和Unity通用此方案,只不过读写文件的接口略有不同,lua代码的处理是相同的。
下面两个方法是 LuaTable和字符串互相转换的代码
function XUtils.luaTableToString(tab, sp)
sp = sp or ""
local s = ""
for k,v in pairs(tab) do
if type(k) == "number" then
k = _strFormat("[%s]", k)
end
if type(v) == "table" then
s = _strFormat("%s %s=%s,",s, k, XUtils.luaTableToString(v))
elseif type(v) == "string" then
s = _strFormat("%s %s='%s',",s, k, v)
else
s = _strFormat("%s %s=%s,",s, k, v)
end
s = _strFormat("%s%s",s,sp)
end
return _strFormat("{%s%s}",sp,s)
end
function XUtils.stringToLuaTable(str)
if string.isEmpty(str) then
return {}
end
local tab
local bSucc, _ = xpcall(function()
tab = load( "return "..str )()
end, __G__TRACKWARN__)
if not bSucc then
return {}, false
end
return tab
end
获取UE5本地存储地址:
local function GetPath()
local userId = GetLocalDataAvatarDID(BP_GameInstance_Inst)
local filePath = UE.FPaths.ProjectSavedDir() .. string.format( "localdata_%s.bin", v~=0 and v or "def")
return filePath
end
存储代码:_defData 是我想存的LuaTable对象,SaveStringToFile方法把字符串转二进制并存到目标路径文件里
local function SaveDef_()
local filePath = GetPath()
local str = XUtils.luaTableToString(_defData or {}, "\n")
local ret = UE.FFileHelper.SaveStringToFile(str, filePath)
end
存储后的文件长这样子
读取二进制存档,把二进制文件读成string,再把string解析成luaTable
local function Init_()
local filePath = GetPath()
if UE.FPaths.FileExists(filePath) then
local fileString = UE.FFileHelper.LoadFileToString(filePath)
local luaTable = XUtils.stringToLuaTable(fileString)
--拿到luaTable数据
end
end
到此成功完成了