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

【界面UI】红点系统与面板刷新:UI 状态驱动设计

2026-09-23 16:57 作者:996 技术组 996引擎Lua教程传奇脚本

红点为什么容易写崩

红点是留存利器,也是 UI 层最容易写乱的功能:每个系统各写一套红点逻辑,按钮点击后忘了通知其他红点,红点闪烁与实际状态对不上。问题的根源是把"红点"当成了各界面自己的私事。正确做法是把红点抽成独立的状态驱动系统:红点只是数据的一种渲染,数据变了红点自然变。

红点树:一个表驱动的实现

把所有红点按界面层级组织成树:根节点"主界面"下挂"背包""任务""商城",背包下又挂"可穿戴""可出售"。叶子节点的红亮条件是一个注册进来的检测函数,父节点红亮 = 任意子节点红亮。数值变化时只重算受影响的一条链:

lua

local RP = { nodes = {} }

function RP.reg(id, parent, check)
    RP.nodes[id] = { parent = parent, check = check, on = false }
end

function RP.refresh(id)
    local n = RP.nodes[id]
    local on = n.check and n.check() or false
    if not on then
        for _, child in pairs(RP.nodes) do
            if child.parent == id and child.on then on = true break end
        end
    end
    if n.on ~= on then
        n.on = on
        UIsetIcon(id, on)            -- 实际点亮/熄灭
        if n.parent then RP.refresh(n.parent) end
    end
end

数据变化处只需调一句 RP.refresh("bag"),整条链自动联动,任何界面都不需要自己维护红点状态。

刷新原则:状态驱动而非事件驱动

面板刷新同理。新手常写"领奖励 → 调刷新背包 → 调刷新任务 → 调刷新主界面",每加一个系统就要往所有相关事件里插刷新调用,漏一处就出"数字不对"的 bug。状态驱动的做法:界面显示时从数据源全量刷新一次,数据层变更后广播"某数据变了"事件,订阅者各自刷新——界面永远反映数据的当前真实状态,不存在"忘了通知谁"。

性能上注意两点:高频数据(血量)的刷新做合并,一帧内多次变更只渲染一次;面板不可见时只更新数据不刷新控件,打开时全量刷一遍。

排查口诀

红点不亮/常亮,按固定顺序查三步:检测函数的输入数据对不对(打印 check 结果)→ refresh 是否被正确触发(在 refresh 加计数日志)→ 父节点聚合逻辑是否覆盖了该子节点。状态驱动的系统里,问题永远落在"数据、订阅、聚合"三点之一,比在十几个界面文件里翻事件调用快得多。

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

reddot(actor, win_id, btn_id, x, y, type, info)

给按钮增加红点,数据层状态变化时由统一入口写红点,界面不自己判断

lua

reddot(actor, 104, 7, 15, 15, 1, 5055)

reddel(actor, win_id, btn_id)

给按钮删除红点,状态复位时清掉红点,漏清是红点系统最常见的坑

openwindows(actor, winID)

查看自己面板,打开面板时再拉一次数据,而不是提前缓存

addbutton(actor, windowid, buttonid, icon)

增加自定义按钮,动态列表类界面靠它挂载

delbutton(actor, windowid, buttonid)

删除自定义按钮,界面关闭或数据缩短时必须回收

sendredvartoclient(actor)

立即推送前端变量,需要即时刷新的显示项走推送,避免整面板重建

【框架设计】宠物进阶:进化材料链与形态切换

【框架设计】坐骑系统:碎片合成与品质保底

【网络通信】动作与表情:社交广播的轻量协议

【性能调优】延迟结算:非紧急任务的队列消化

【安全加密】数据脱敏:日志与取证导出的隐私处理

【界面UI】BUFF 图标栏:增益排列与剩余时间

作者履历与出处

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

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

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

LATEST ARTICLES

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

引擎触发未知暗殿镜像boss刷新

【引擎触发】未知暗殿:真假boss的镜像刷新触发设计

实战应用:用在哪里 未知暗殿是传奇最著名的陷阱地图:满屋子的“祖玛教主”,只有一只是真的,其余全是会秒人的假教主。镜像刷新触…

2026-09-23 18:43 996 技术组
玩法策划牧场经营养殖产出

【玩法策划】牧场经营:领地养殖与产出上缴设计

实战应用:用在哪里 行会领地只有一块挂名的地,成员没有归属感。牧场经营把领地变成养殖场:行会购入幼畜分给成员认养,认养者每日…

2026-09-23 18:43 996 技术组
玩法策划行会演出晚会评选

【玩法策划】行会演出:节日晚会的节目征集与评选设计

实战应用:用在哪里 节日活动都是打打杀杀,会乐器的玩家无处施展。行会演出把节日晚会做成玩法:会内征集节目(演奏、时装秀、脱口…

2026-09-23 18:43 996 技术组
运维发布应急预案分级响应

【运维发布】应急预案分级:P0 到 P3 事件的响应矩阵

实战应用:用在哪里 凌晨三点金币产出异常和白天聊天频道卡顿,显然不是一回事,但响应流程曾经一模一样。应急预案分级把事件分成四…

2026-09-23 18:43 996 技术组
后端接口祈福许愿奖励池全服

【后端接口】祈福许愿:全服祈福的奖励池接口

实战应用:用在哪里 全服许愿墙是最有烟火气的玩法:玩家写下心愿投入奖励池,许愿消耗许愿币,系统按周开奖,幸运者瓜分奖池大奖。…

2026-09-23 18:43 996 技术组
前端接口成就展示墙陈列荣誉

【前端接口】成就展示墙:个人成就的前端陈列

实战应用:用在哪里 成就系统做了几十项,玩家做完就翻篇,成就的荣誉感没有出口。成就展示墙给玩家一面可以布置的墙:已解锁的成就…

2026-09-23 18:43 996 技术组