NPC 对话是"您好,需要服务吗"一句话带过;剧情 NPC 的分支选择全靠硬编码 if——加一句台词要改三处代码,文案同学无法参与。对话树封装:分支对话配表驱动——节点存台词与选项、选项指向下一节点,配表加行即加剧情,代码零改动。
对话配表与渲染。示例代码如下:
local DIALOG = {
[1] = { text = "少侠可曾听闻祖玛教主?", opts = {
{ t = "愿闻其详", next = 2 },
{ t = "告辞", next = 0 } } },
[2] = { text = "它盘踞祖玛七层,宝物无数。", opts = {
{ t = "接下讨伐令", next = 3, give = 9001 },
{ t = "再问细节", next = 4 } } },
[3] = { text = "好!接令吧。", opts = {} }
}
local function talk(actor, nodeId)
local node = DIALOG[nodeId]
if not node then
return
end
sendmsg(actor, 1, node.text)
for i, opt in ipairs(node.opts) do
sendmsg(actor, 1, i .. ". " .. opt.t)
end
setplayvar(actor, 0, "DialogNode", nodeId, 0)
end
选项响应。示例代码如下:
local function pickOption(actor, idx)
local nodeId = tonumber(getplayvar(actor, 0, "DialogNode")) or 1
local node = DIALOG[nodeId]
local opt = node and node.opts[idx]
if not opt then
return
end
if opt.give == 9001 then
giveitem(actor, "讨伐令", 1, 0, "接取讨伐")
end
talk(actor, opt.next)
end
DIALOG 配表三要素:节点台词 text、选项列表 opts、选项的 next 指针(0 表示对话结束)。talk 渲染节点并把当前节点号写入 DialogNode(临时变量);pickOption 读当前节点按序号取选项、执行选项副作用(give 发道具)再跳下一节点——加剧情等于加表行,文案同学自己就能排故事。
对话树踩过三个坑:一是配表循环引用(A 节点的 next 指回 A)导致死循环刷屏,加载时校验每个 next 可达且无环;二是选项副作用硬编码在 pickOption 里越积越多,副作用改查表分发(give 动作对应动作函数表),选项只声明做什么不写怎么做;三是玩家对话中途下线,DialogNode 残留导致下次上线串话,对话状态全部用临时变量且对话结束即清。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会人少时打不死召唤的目标,人多时又抢不到,时机全靠会长手点,纠纷不断。改为每日一次的定时召唤加伤害…
【游戏】 一、业务场景 30 人团本开荒,伤害按个人目标结算,近战几秒就把目标打空,后排毫无参与感。改为全团共享血池:目标总…
【语法】 一、隐蔽陷阱 账目表频繁单点改值又要频繁查前 n 项合计:朴素写法改值一步、查询要扫 n 个元素,查询一多整体就慢…
【游戏】 一、业务场景 想拉动日活,登录礼包要跟着连登天数走:第 1 天小奖,第 7 天大奖。发放核心就一行:按连登天数查阶…
【语法】 一、隐蔽陷阱 大数加法用字符串竖式解决了失真,两笔大数相乘怎么办?tonumber 相乘在 9 位乘 9 位时结果…
【语法】 一、隐蔽陷阱 两批任务分别每 6 分钟与每 8 分钟刷新一次,想知道它们同帧刷新的间隔,从 1 开始逐个试除到 4…