活动的配置表长成三层嵌套:活动 ID 下面是场次、场次下面是奖励——深层的取值要三级点号连击,漏一层就 nil 报错。扁平化把嵌套表摊成「键路径到值」的平表,深层的存取变成一次索引。
---嵌套表的扁平化:a.b.c => "a.b.c"
local function flatten(t, prefix, out)
out = out or {}
for k, v in pairs(t) do
local key = prefix and (prefix .. "." .. k) or tostring(k)
if type(v) == "table" then
flatten(v, key, out)
else
out[key] = v
end
end
return out
end
---活动配置的摊平
local actCfg = {
id = "exp_double",
schedule = { start = "1200", ["end"] = "1400" },
reward = { exp = 2, gold = 5000 },
}
local flat = flatten(actCfg)
print(flat["schedule.start"]) -- 1200
print(flat["reward.exp"]) -- 2
flatten 递归把嵌套表摊平:键路径用点号串起来,三层的取值从 cfg.schedule.reward.exp 变成 flat["reward.exp"]——一次索引拿到值,路径的存在性检查也简单(判 nil 即可)。扁平表的遍历友好:pairs 一层即可扫全叶子,深层的统计与校验不再递归。键路径的分隔符要避开键里的点号(浮点数键 1.5 会被切错),分隔符的选型或键的转义是前置的决定。
---按路径取值的工具
local function get(t, path)
local cur = t
for seg in path:gmatch("[^.]+") do
if type(cur) ~= "table" then return nil end
cur = cur[seg]
end
return cur
end
---按路径设值的工具
local function set(t, path, value)
local keys = {}
for seg in path:gmatch("[^.]+") do
keys[#keys + 1] = seg
end
local cur = t
for i = 1, #keys - 1 do
cur[keys[i]] = cur[keys[i]] or {}
cur = cur[keys[i]]
end
cur[keys[#keys]] = value
end
get 与 set 是扁平化的镜像工具:get 按路径逐段下钻取值,set 按路径逐段建层写入——深层的写值不必手工铺中间层。两件工具的用法在配置的补丁上最顺:热更新只下发变更的路径与值(reward.exp = 3),set 逐条打上,整表的重建被增量替代。扁平化的双向转换要保对称:flatten 之后 roundtrip 回嵌套,两张表的内容必须等价——对称性的测试是工具的验收线。扁平表的排序按键路径的字典序,同前缀的键天然聚在一起,配置的审阅效率因此提升。
扁平化的对称性测试:嵌套、扁平、还原的 roundtrip 断言内容的等价;键路径的分隔符冲突检测,含分隔符的原始键在扁平化时报错。
键路径曾经用点号拼数组下标,数组的数字键与字段键混排后路径歧义,数组段用方括号标记区分。扁平表的键曾经大小写敏感,配置的大小写笔误造成两个近似键,键的归一化(统一小写)入规范。深层的 set 曾经覆盖了中间层的子表,路径建层的写法只补缺失不覆盖。
扁平化的工具进公共库:flatten、get、set 三件套配套 roundtrip 测试。配置的热更通道走键路径的增量,增量的格式与 set 的参数对齐。嵌套的层数上限 4 层,更深的配置先审视设计的合理性。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 版本更新上线后突然下架了某件热销商品,但更新公告里没有提到这件事。玩家发现后截图传播,两小时内贴吧帖子超…
实战应用:用在哪里 技能升级后缺少视觉与听觉反馈,玩家不确定升级是否成功。技能升级反馈在升级成功的瞬间展示金色光效、播放升级…
实战应用:用在哪里 点击其他玩家的角色时默认弹出查看面板,但在战斗中玩家希望点击即攻击。双击检测在单击查看的基础上增加双击攻…
实战应用:用在哪里 灵宠在战斗中作用有限,玩家养了宠物但缺少日常互动。灵宠派遣让宠物成为玩家的探索伙伴:派遣灵宠外出探索获取…
实战应用:用在哪里 宠物养成线只有喂食和升级,缺少宠物之间的对抗玩法。宠物竞技让两只宠物在专属竞技场进行自动对战,玩家通过调…
实战应用:用在哪里 测试环境直接复制生产库会把真实玩家数据暴露给开发和测试人员,存在隐私泄露风险。脱敏测试库的搭建分三步:从…