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

系统变量:存在服务器上的共享数字与字符串

2026-10-20 23:26 作者:吴大圣老师 Lua实战系统变量存储

局部变量跑完就没;系统变量写进服务器数据库,全服共享、重启还在。

一、四种变量先分清

变量写法 / 归属存哪谁能用
全局变量不写 localLua 虚拟机脚本内到处
局部变量local n栈当前作用域
系统变量SetSys / GetSys服务器库全服
个人变量对象上读写玩家库该角色

口诀:要共享、持久 → 系统变量;要跟着人走 → 个人变量;要又快又短命 → 局部。

二、M2 是单线程

同一时刻只跑一个触发。你写死循环 100 万次,后面玩家全排队。
耗时要按毫秒控;高频触发更要短平快。这也是优先 local 的原因:栈上分配,出作用域就扔,比全局/数据库快。

三、系统数字变量

新三端(驼峰式)大致是:

lua
-- 设置 / 读取(名称以引擎说明书为准)
SetSysInt("测试变量一", 12345)
print(GetSysInt("测试变量一"))  --> 12345

未设置时读 int:返回 0,不报错、不是 nil。
数字类型没有值就当 0。

全服统计跑步次数

lua
function LuaRun(actor, ...)
    local n = GetSysInt("全服跑步统计") or 0
    n = n + 1
    SetSysInt("全服跑步统计", n)
    print("全服已跑", n, "步")
end

两个端同时跑,数字是接上的——系统变量是全服共享。

十步发奖

lua
function LuaRun(actor, ...)
    local n = (GetSysInt("跑步步数") or 0) + 1
    SetSysInt("跑步步数", n)
    if n > 10 then
        SetSysInt("跑步步数", 0)
        GiveItem(actor, "木剑", 1)
    end
end

适合:全服首杀、击杀统计、活动累计、排行榜计数。

四、系统字符串变量

lua
SetSysStr("公告", "开服大吉")
print(GetSysStr("公告"))

未设置时读 string:返回空字符串 "",不是 nil。
所以直接拼接会“像报错”:

lua
local s = GetSysStr("计数")   -- 可能是 ""
-- s + 1  -- 空字符串不能直接当数字加

稳妥写法:

lua
local s = GetSysStr("计数")
if s == "" then s = "0" end
local n = tonumber(s) or 0

tonumber("你好") → nil(不是数字串);tostring(123) → "123"。

五、表怎么存进系统变量?

接口只吃字符串。表先转 JSON:

lua
local T = {1,2,3,4,5}
local json = TableToJson(T)      -- 名称以说明书为准
SetSysStr("存储表格", json)

local raw = GetSysStr("存储表格")
local T2 = JsonToTable(raw)
for k, v in pairs(T2) do
    print(k, v)
end

JSON 里字符串用双引号;Lua 单引号在 JSON 里不认,长字符串 [[...]] 包一层更稳。

统计每个玩家步数(挂在系统串里)

lua
function LuaRun(actor, ...)
    local name = GetBaseInfo(actor, 1)
    local raw = GetSysStr("跑步榜")
    local t = (raw == "" or raw == nil) and {} or (JsonToTable(raw) or {})
    t[name] = (t[name] or 0) + 1
    SetSysStr("跑步榜", TableToJson(t))
    print(name, t[name])
end

短路初始化:t = (raw == "") and {} or JsonToTable(raw)。

六、为什么优先数字

数字常更占空间小、算得快;汉字/长字符串更吃资源。
业务能用 int 表达的,别硬塞字符串。

今日练习:写全服跑步计数;再用 JSON 表按角色名记步数,双端同时验证是否共享。


作者履历与出处

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

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

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

LATEST ARTICLES

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