参考:dev/script/ssr/ssrgame/ui/zhuangshengUI.lua@P3 setmetatable+local 局部+等 组合在实际脚本开发的应用
全局表
zhuanshengUI = {}
zhuanshengUI._hideMain = true
local uinodes = setmetatable({},
{
__index = function(t, key)
rawset(t, key, {})
return t[key]
end
})
local ui = uinodes.ui
这是一个常用的UI操作模式:
- uinodes
是一个全局表,用于储存所有UI相关的节点引用 - uinodes.ui
通常包含了通过GUI编辑器创建的所有UI组件引用
实例:
-- 获取UI引用
local ui = uinodes.ui
-- 访问具体的UI组件
ui.Panel_1 -- 访问名为 Panel_1 的面板
ui.btn_close -- 访问关闭按钮
ui.img_bg -- 访问背景图片
ui.txt_title -- 访问标题文本
-- 对UI组件进行操作
GUI:setVisible(ui.Panel_1, true) -- 显示面板
GUI:setString(ui.txt_title, "新标题") -- 设置文本
GUI:setPosition(ui.img_bg, 100, 100) -- 设置位置
主要用途:
- 提供一个统一的方式访问UI组件
- 避免重复获取UI组件引用
- 使代码更清晰和易于维护
通常在UI初始化时会设置这些引用
function mianfeifuliUI.Init()
-- 创建UI时自动保存所有组件引用到 uinodes.ui
uinodes.ui = {
Panel_1 = panel1,
btn_close = closeBtn,
img_bg = bgImage,
-- ... 其他UI组件
}
end
这样在后续的代码中就可以通过 local ui = uinodes.ui 方便地访问所有UI组件。
局部表
local uinodes = setmetatable({},
{
__index = function(t, key)
rawset(t, key, {})
return t[key]
end
})
这是创建一个特殊的表结构:
local uinodes
表示这是一个局部表,不是全局表
- 只在当前文件(zhuanshengUI.lua)中可以访问
- 其他文件无法直接访问这个 uinodes
setmetatable
是 Lua 的元表机制:
- 第一个参数
{} 是创建一个空表
- 第二个参数是元表,定义了表的特殊行为
__index
是元表的一个元方法:
- 当访问 uinodes 中不存在的键时会触发这个函数
- 例如:当访问
uinodes.ui 但 ui 不存在时
这个设计的作用是:
-- 当第一次访问 uinodes.ui 时 local ui = uinodes.ui -- 会自动创建一个新的空表并赋值给 uinodes.ui -- 相当于自动执行了: if not uinodes.ui then uinodes.ui = {} end
使用实例:
-- 第一次访问时自动创建空表
uinodes.ui.button1 = someButton -- uinodes.ui 会被自动创建
uinodes.windows.main = someWindow -- uinodes.windows 会被自动创建
-- 不需要事先声明:
-- uinodes.ui = {}
-- uinodes.windows = {}
这种设计的好处:
- 自动初始化:不需要手动创建子表
- 防止错误:访问不存在的键时不会报错
- 代码更简洁:减少了初始化代码
- 按需创建:只有被访问的键才会创建对应的表
评论