[纪录]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);
    }

    /// <summary>
    /// 保存数据
    /// </summary>
    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内部采用一种通用的基础数据结构来表示所有数据类型,Lua语言及其精简,只有字符串和表两种最基本的数据结构。然...
    JunChow520阅读 2,349评论 0 1
  • 指令集 lua_capture_error_log lua_use_default_type lua_malloc...
    吃瓜的东阅读 12,098评论 0 2
  • Lua是目前国内使用最多的热更语言,基于Lua的热更框架也非常多,最近学习了一下ToLua的热更框架,主要使用的问...
    达也酱阅读 22,463评论 4 38
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,724评论 1 7
  • 1. 写在前面 很多时候我们都需要借助一些脚本语言来为我们实现一些动态的配置,那么就会涉及到如何让脚本语言跟原生语...
    杰嗒嗒的阿杰阅读 3,455评论 9 31