local DataMgr = setmetatable({},{ __index = function(t, key) return require("Datas."..key) end}) function DataMgr.Print_t ( t ) -- print table local print_r_cache={} local function sub_print_r(t,indent) if (print_r_cache[tostring(t)]) then print(indent.."*"..tostring(t)) else print_r_cache[tostring(t)]=true if (type(t)=="table") then for pos,val in pairs(t) do if (type(val)=="table") then print(indent.."["..pos.."] => "..tostring(t).." {") sub_print_r(val,indent..string.rep(" ",string.len(pos)+8)) print(indent..string.rep(" ",string.len(pos)+6).."}") elseif (type(val)=="string") then print(indent.."["..pos..'] => "'..val..'"') else print(indent.."["..pos.."] => "..tostring(val)) end end else print(indent..tostring(t)) end end end if (type(t)=="table") then print(tostring(t).." {") sub_print_r(t," ") print("}") else sub_print_r(t," ") end print() end function DataMgr.GetData(filename) local pro_path = UE4.UKismetSystemLibrary.GetProjectContentDirectory() local file = io.open(pro_path..'../Datas/'..filename .. '.json', "r") local info = file:read("*a") file:close() local json= require("rapidjson") local res = json.decode(info) return res end function DataMgr.GetLevelLoaderJsonData(shortname) local pro_path = UE4.UKismetSystemLibrary.GetProjectContentDirectory() local path=pro_path..'Script/Datas/Houdini_data/'..shortname .. '.json' local info = UE4.URuntimeCommonFunctionLibrary.LoadFile(path) -- local file = io.open(path, "r") -- local info = file:read("*a") -- file:close() local json= require("rapidjson") local res = json.decode(info) return res end -- 预加载数据表,将所有的数据表全部加载到内存中,减少之后读表index的时间消耗 function DataMgr.PreLoad() local DataNames = require("Datas.DataNames") for _, DataName in pairs(DataNames) do require("Datas."..DataName) end end local all_tables = {} function DataMgr.CollectTable(Table) for k, tbl in pairs(all_tables) do if tbl == Table then all_tables[k] = nil for k, v in pairs(tbl) do if type(v) == "table" then DataMgr.CollectTable(v) end end break end end end DataMgr.ReadOnly_NewIndex = function(t, k, v) local rawset = rawset local getmetatable = getmetatable error("没法对导表数据【" .. tostring(t.__name) .."】中字段【" .. tostring(k) .. "】进行写操作") end function DataMgr.CleanAllTable() all_tables = {} local DataNames = require("Datas.DataNames") local HotFix = require("HotFix") local data_module_table = rawget(HotFix, "data_module_table") for _, DataName in pairs(DataNames) do if not (data_module_table and data_module_table[DataName]) then require("UnLuaHotReload").RemoveLoadedModule("Datas."..DataName) end end end function read_only(name, tbl) if not all_tables[tbl] then local tbl_mt = getmetatable(tbl) if not tbl_mt then tbl_mt = {} setmetatable(tbl, tbl_mt) end local proxy = tbl_mt.__read_only_proxy if not proxy then proxy = {__name = name} tbl_mt.__read_only_proxy = proxy local proxy_mt = { __index = tbl, __newindex = DataMgr.ReadOnly_NewIndex, __pairs = function (t) return pairs(tbl) end, -- __ipairs = function (t) return ipairs(tbl) end, 5.3版本不需要此方法 __len = function (t) return #tbl end, __read_only_proxy = proxy } setmetatable(proxy, proxy_mt) end all_tables[tbl] = proxy for k, v in pairs(tbl) do if type(v) == "table" then tbl[k] = read_only(name, v) end end end return all_tables[tbl] end --if URuntimeCommonFunctionLibrary.IsDebugDataTable() then if true then DataMgr.ReadOnly = read_only else DataMgr.ReadOnly = function (name, tbl) return tbl end end _G.DataMgr = DataMgr return DataMgr