CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
界面UINPC交互

【界面UI】NPC 对话框:打字机效果与选项按钮

2026-09-22 01:12 作者:996 技术组 996引擎Lua教程传奇脚本界面UINPC交互

实战应用:用在哪里

NPC 对话是剧情的载体:铁匠的吆喝、村长的嘱托、神秘人的低语——打字机的逐字效果让文字有了语气,选项按钮让对话有了分支。对话框的实现要点是逐字的节奏、选项的呈现与跳过的礼貌。

打字机的效果

lua
---NPC 对话:逐字显示的打字机
Dialog.lines = {}
Dialog.lineIdx = 1
Dialog.charIdx = 0

function Dialog.start(npcName, lines)
    Dialog.lines = lines
    Dialog.lineIdx = 1
    Dialog.charIdx = 0
    GUI:Text_Create(Dialog.win, "npc_name", 10, 8, 13,
        "#FFAA00", npcName)
    Dialog.label = GUI:Text_Create(Dialog.win, "text",
        10, 34, 12, "#FFFFFF", "")
    SL:Schedule(0.04, Dialog.typeNext)
end

function Dialog.typeNext()
    local line = Dialog.lines[Dialog.lineIdx]
    if not line then return end
    Dialog.charIdx = Dialog.charIdx + 1
    GUI:Text_setString(Dialog.label,
        line:sub(1, Dialog.charIdx))
    if Dialog.charIdx >= #line then
        Dialog.showOptions()
        SL:StopSchedule(Dialog.typeNext)
    end
end

打字机以 40 毫秒一字的速度呈现对话:文字逐个浮现,NPC 的语气在节奏里传递——节奏的快慢就是情绪的标点。逐字的驱动用统一的 Schedule,整行显示完毕停止定时器并呼出选项按钮。点击对话区域的跳过:再点一下立即显示整行(急性子玩家的福音),再次点击翻到下一行——节奏的控制在玩家手里。

选项的呈现

lua
---选项按钮:分支的呈现与提交
function Dialog.showOptions()
    local opts = Dialog.current.options or {}
    for i, opt in ipairs(opts) do
        local btn = GUI:Button_Create(Dialog.win,
            "opt" .. i, 10, 120 + (i - 1) * 36)
        GUI:Button_setTitleText(btn, opt.text)
        GUI:addOnClickEvent(btn, function()
            SL:SendNetMsg(MSGID.NPC_OPTION,
                Dialog.npcId, opt.idx, 0, "")
            Dialog.close()
        end)
    end
end

选项按钮按服务器的分支下发渲染:每个按钮绑定分支编号,点击提交编号由服务器路由到对应的剧情线——分支的裁决权在服务器,客户端只做呈现。选项的文案避免剧透后果:「问问关于宝藏的传闻」比「选择帮助他」更有悬念。对话窗口的位置避让 NPC 的模型,文字的宽度自动换行,长对话的滚动让剧情不挤成一团。对话中的战斗触发:某些选项直接引战斗(拒绝强盗的勒索),窗口关闭与战斗的入场无缝衔接。

验证与监控

打字机的节奏与跳过率统计:跳过率高说明文案过长或节奏过慢;选项的分支分布数据反哺剧情的设计,冷门的分支检查可达性。

踩坑记录

打字机的定时器曾经在跳过后仍运行,文字与选项重叠显示,定时器的停止与跳过分支绑定。选项按钮曾经被长文案撑出窗口,按钮的高度自适应文案的行数。对话的中文截断曾经按字节切分,半个汉字显示为乱码,按 UTF-8 字符边界切分。

上线要点

对话的文案进配置表,剧情策划自助维护。打字机的速度三档可调:玩家在设置里选择沉浸、标准、快速。重要的剧情选项支持回看:对话历史在窗口内上翻,选择的脉络可追。

作者履历与出处

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

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

最新技术文章 · 实战干货

LATEST ARTICLES

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

工具链压测模拟

【工具链】压测脚本:登录洪峰的模拟与值守工具

实战应用:用在哪里 新服开放预计首日涌三万新玩家,现有环境从未承受过这种规模。压测脚本模拟登录洪峰:按真实用户的操作时序生成…

2026-09-23 08:46 996 技术组
数据存储快照属性

【数据存储】属性快照表:每日战力与属性的存档

实战应用:用在哪里 玩家反馈装备强化后战力没变化,开发排查发现属性计算逻辑在版本更新中被误改了。属性快照表每日存档玩家的核心…

2026-09-23 08:46 996 技术组
运维发布熔断隔离

【运维发布】熔断机制:依赖故障的自动隔离与恢复

实战应用:用在哪里 支付平台的接口响应从 200 毫秒恶化到 15 秒,调用方因等待超时堆积了大量线程,最终导致整个服务进程…

2026-09-23 08:46 996 技术组
案例复盘充值支付

【案例复盘】重复充值:支付回调重复的资损复盘

实战应用:用在哪里 支付平台的回调机制在网络抖动时会重复发送同一笔充值通知,如果服务端不做幂等处理就会重复发放元宝。某月因网…

2026-09-23 08:46 996 技术组
玩法策划篝火社交

【玩法策划】werewolf 联动:行会篝火晚会的社交玩法设计

实战应用:用在哪里 行会活动集中在攻城战,日常缺乏轻量社交场景。行会篝火晚会做行会固定社交活动:每周三、周日晚在行会驻地点燃…

2026-09-23 08:46 996 技术组
引擎触发矿洞塌方

【引擎触发】矿洞塌方:塌方预警与撤离的触发设计

实战应用:用在哪里 矿洞深层的随机塌方事件是高收益高风险的野外玩法:塌方前 60 秒全屏预警,玩家撤离至安全区可躲避伤害,停…

2026-09-23 08:46 996 技术组