zworld-em/Content/Script/Core/DataMgr.lua

147 lines
4.5 KiB
Lua
Raw Normal View History

2025-05-11 22:07:21 +08:00
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