嘤嘤嘤,转眼又拼了一个多月UI了,自己已经是个没用的rua鸡了,最近啥也没学,是真的没啥写的了。随便找点百度能找得到的东西发上来吧!
最近去了新项目组,新项目组还在做demo,每天自己XJB搞,最近需要一个存档功能,于是就开始琢磨怎么把lua数据本地化。
开始我寻思的是把lua数据直接io成一个文件,然后我用的时候直接require一下就完事了,后来发现我们资源都在resource里,lua的io直接报废不能用。写也写不出来,读也读不到,真rua鸡(是我rua鸡,因为我根本不知道为啥写不进也读不出)。
后来想想,反正都是字符串,不然直接用unity的PlayerPrefs算了,然后我再读字符串转回表就行了。算了不多BB了,代码简单的eb我直接贴了
function PlayerData.savePlayerData()
local str = PlayerData.getPlayerDataString()
Util.SetString("playerData", str)
----测试用文件存档 打包时删掉
local file = io.open("test.lua", "w")
file:write(str)
file:close()
end
function PlayerData.getPlayerDataString()
local string = "local playerData = "
string = PlayerData.toSerial(player, string)
string = string .. "\nreturn playerData"
return string
end
function PlayerData.toSerial(tb, str)
if type(tb) == "number" then
str = str .. tb
elseif type(tb) == "string" then
str = str .. string.format("%q",tb)
elseif type(tb) == "boolean" then
if tb == true then
str = str .. "true"
else
str = str .. "false"
end
elseif type(tb) == "table" then
str = str .. '{\n'
for i, v in pairs(tb) do
str = str .. '['
str = PlayerData.toSerial(i, str)
str = str .. ']='
str = PlayerData.toSerial(v, str)
str = str .. ',\n'
end
str = str .. '}\n'
end
return str
end
感觉没啥好说的,就直接莽就完了,其中util就是自己封装的PlayerPrefs:
public static string GetString(string key)
{
return PlayerPrefs.GetString(key);
}
///
/// 保存数据
///
public static void SetString(string key, string value = default(string))
{
PlayerPrefs.DeleteKey(key);
PlayerPrefs.SetString(key, value);
}
最后贴个生成的结果(io成文件只为了debug):缩进挺rua鸡的,但是总比print的强,
local playerData = {
["addTalkData"]={
[1009]={
[1]="MQ1_13",
}
,
[1001]={
[1]="MQ1_1",
[2]="MQ1_2",
[3]="MQ1_3",
}
,
}
,
["teamData"]={
[1]=1001,
}
,
["dateData"]=391,
["fatherQuestTable"]={
["MQ1"]={
["questId"]="MQ1",
["finish"]=false,
["acceptTime"]=391,
}
,
}
,
["addNpcActionData"]={
}
,
["currentPlace"]=1001,
["bagData"]={
}
,
["currentCity"]=1001,
["positionData"]=2,
["talkFinishData"]={
["MQ1_3"]=true,
["MQ1_2"]=true,
["MQ1_1"]=true,
}
,
["questTarget"]="MQ1_5",
["battleFinishData"]={
[1003]="win",
}
,
["buyData"]={
}
,
["currentNpc"]=1001,
["addNpc2CityData"]={
}
,
["addNpc2PlaceData"]={
}
,
["Money"]=10,
["subQuestTable"]={
["MQ1_3"]={
["questId"]="MQ1_3",
["finish"]=true,
["acceptTime"]=391,
}
,
["MQ1_2"]={
["questId"]="MQ1_2",
["finish"]=true,
["acceptTime"]=391,
}
,
["MQ1_5"]={
["questId"]="MQ1_5",
["finish"]=false,
["acceptTime"]=391,
}
,
["MQ1_4"]={
["questId"]="MQ1_4",
["finish"]=true,
["acceptTime"]=391,
}
,
["MQ1_1"]={
["questId"]="MQ1_1",
["finish"]=true,
["acceptTime"]=391,
}
,
}
,
}
return playerData
对了,最后还有一个事儿,Xlua不知道是用的lua版本跟tolua不一样还是咋的,百度了半天怎么从字符串转回表,人家都是loadstring,我试了半天都说没这函数,最后用load(好像是反射)加载回来的:
player = load(Util.GetString("playerData"))()