CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战996引擎对话树配表驱动

【进阶实战】NPC对话树:分支对话的配表驱动封装

2026-09-25 16:48 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战996引擎Lua对话树配表驱动

业务场景

NPC 对话是"您好,需要服务吗"一句话带过;剧情 NPC 的分支选择全靠硬编码 if——加一句台词要改三处代码,文案同学无法参与。对话树封装:分支对话配表驱动——节点存台词与选项、选项指向下一节点,配表加行即加剧情,代码零改动。

核心实现

对话配表与渲染。示例代码如下:

lua
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

选项响应。示例代码如下:

lua
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 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

帮会BOSS讨伐:每日召唤与伤害排名奖励

【游戏】 一、业务场景 帮会人少时打不死召唤的目标,人多时又抢不到,时机全靠会长手点,纠纷不断。改为每日一次的定时召唤加伤害…

2026-09-27 00:41 996 技术组
进阶实战游戏功能

帮会团本:全团共享血量的阶段挑战

【游戏】 一、业务场景 30 人团本开荒,伤害按个人目标结算,近战几秒就把目标打空,后排毫无参与感。改为全团共享血池:目标总…

2026-09-27 00:41 996 技术组
高级技巧语法算法

Lua树状数组:单点更新与区间求和

【语法】 一、隐蔽陷阱 账目表频繁单点改值又要频繁查前 n 项合计:朴素写法改值一步、查询要扫 n 个元素,查询一多整体就慢…

2026-09-27 00:41 996 技术组
策划架构游戏功能

登录累计奖励:连登天数的阶梯礼包

【游戏】 一、业务场景 想拉动日活,登录礼包要跟着连登天数走:第 1 天小奖,第 7 天大奖。发放核心就一行:按连登天数查阶…

2026-09-27 00:41 996 技术组
高级技巧语法算法

Lua大数乘法:竖式逐位乘的错位累加

【语法】 一、隐蔽陷阱 大数加法用字符串竖式解决了失真,两笔大数相乘怎么办?tonumber 相乘在 9 位乘 9 位时结果…

2026-09-27 00:41 996 技术组
入门夯实语法算法

Lua最小公倍数:辗转相除派生的倍数求解

【语法】 一、隐蔽陷阱 两批任务分别每 6 分钟与每 8 分钟刷新一次,想知道它们同帧刷新的间隔,从 1 开始逐个试除到 4…

2026-09-27 00:41 996 技术组