[纪录]Lua+Unity进行临时的数据本地化处理

      嘤嘤嘤,转眼又拼了一个多月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"))()

你可能感兴趣的:([纪录]Lua+Unity进行临时的数据本地化处理)