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

【框架设计】元表与面向对象:用 setmetatable 搭类系统

2026-09-23 15:13 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本

Lua 没有类,但有元表

Lua 本身没有 class 关键字,但通过元表(metatable)可以搭出完整的面向对象体系。核心只有一个机制:当你访问一个 table 不存在的键时,Lua 会去查它的 __index 元方法。把 __index 指向类模板,实例就能"继承"类上的所有方法——这就是 Lua 面向对象的全部秘密。

lua

local Monster = {}
Monster.__index = Monster

function Monster.new(name, hp)
    return setmetatable({ name = name, hp = hp }, Monster)
end

function Monster:hit(dmg)
    self.hp = self.hp - dmg
    if self.hp <= 0 then self:die() end
end

function Monster:die()
    release_print(self.name .. " 被击杀")
end

Monster.new 里 setmetatable({实例字段}, Monster) 是点睛之笔:实例表只存自己的数据(name、hp),方法全部落在类表上,一百个实例共享同一份方法,内存开销极小。

继承与多态

子类把 __index 指向父类,就形成原型链:查找顺序是实例 → 子类 → 父类 → nil。子类重写 die 方法即实现多态,父类代码里调 self:die() 会自动派发到子类版本:

lua

local Boss = setmetatable({}, { __index = Monster })
Boss.__index = Boss

function Boss.new(name)
    local o = Monster.new(name, 10000)
    return setmetatable(o, Boss)
end

function Boss:die()          -- 重写
    Monster.die(self)        -- 可选:先走父类逻辑
    release_print("掉落稀有装备")
end

工程化要点

第一,析构要自觉:Lua 没有自动析构,定义 Monster.delete(o) 做引用清理,销毁时必须显式调用,否则闭包和事件监听会泄漏。第二,类型判断用 getmetatable(o) == Monster,比给表塞个 type 字段更可靠。第三,热更友好性:方法都挂在类表上,热更时替换类表的方法即可全局生效,实例无需重建——这也是"实例只存数据"设计的另一个好处。第四,避免继承层级超过三层,Lua 的原型链查找是运行时的,层级越深排错越难,组合优于继承在这里同样成立。

把这套类系统封装成 class() 工具函数(自动处理 new/继承/super 引用),一个几百行的轻量 OOP 库就成型了,996 生态里大量框架正是这么做的。

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

require(path)

加载文件,类系统按模块分发,加载顺序就是元表链的建立顺序

lua

ssrNetMsgCfg = require("Envir/QuestDiary/net/NetMsgCfg.lua")

callfunbynpc(actor, npcidx, delaytime, func, sParam)

调用其他NPC的lua函数(注意:如果开启多线程,会导致执行失败),继承链上游的方法调用在引擎内的既有通道

release_print(msg)

打印消息到控制台,元表链断了通常表现为 nil 调用,先把实例与元表打出来

printusetime(play, on, off)

打印脚本总耗时(微秒),属性访问成本与元表层数直接相关,值得实测

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

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

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

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

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

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

作者履历与出处

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

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

最新技术文章 · 实战干货

LATEST ARTICLES

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

引擎触发烈火剑法连击战士

【引擎触发】疾风烈火斩:烈火剑法连击的判定触发设计

实战应用:用在哪里 战士的烈火剑法一击熄火后要等八秒冷却,连招断档感强烈。疾风烈火斩在烈火剑法命中后给一次连击窗口:三秒内再…

2026-09-23 15:45 996 技术组 · 0 阅读
玩法策划阵营声望声望压制

【玩法策划】阵营声望:声望等级与敌对压制设计

实战应用:用在哪里 阵营对抗打到中期容易疲软:打赢没有额外好处,输掉也没有代价。阵营声望体系给阵营战装上荣誉刻度:个人与阵营…

2026-09-23 15:45 996 技术组 · 0 阅读
玩法策划城主施政市政建设

【玩法策划】城主施政:市政令牌与城市建设玩法

实战应用:用在哪里 拿下沙巴克之后呢?城主除了名字挂在城墙上,对城市毫无影响。城主施政玩法让占领变成治理:城主每周获得市政令…

2026-09-23 15:45 996 技术组 · 0 阅读
运维发布备用线路切换演练

【运维发布】备用线路:主线路故障的自动切换演练

实战应用:用在哪里 主线路光缆被挖断的深夜,全服掉线 20 分钟,玩家以为游戏倒闭。备用线路方案给接入层配第二条出口:主线路…

2026-09-23 15:44 996 技术组 · 0 阅读
后端接口行会选举换届

【后端接口】行会选举:官员换届的投票与任期接口

实战应用:用在哪里 行会官员由帮主任命的老模式弊端明显:任人唯亲、能上不能下。行会选举接口把官员换届做成投票制:每两个月一次…

2026-09-23 15:44 996 技术组 · 0 阅读
前端接口技能悬浮卡片说明

【前端接口】技能说明悬浮:技能详情卡片的前端实现

实战应用:用在哪里 烈火剑法的伤害加成、冷却时间、下一级提升,全靠玩家记忆或去官网查。技能说明悬浮卡片在鼠标悬停技能图标零点…

2026-09-23 15:44 996 技术组 · 0 阅读