【LUA基础】全局表和局部表的应用
Lua

【LUA基础】全局表和局部表的应用

是滑稽啊
2025-03-13 / 0 评论 / 3 阅读 / 正在检测是否收录...

参考: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操作模式:

  1. uinodes
    是一个全局表,用于储存所有UI相关的节点引用
  2. 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)    -- 设置位置

主要用途:

  1. 提供一个统一的方式访问UI组件
  2. 避免重复获取UI组件引用
  3. 使代码更清晰和易于维护

通常在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
})

这是创建一个特殊的表结构:

  1. local uinodes

    表示这是一个局部表,不是全局表

  • 只在当前文件(zhuanshengUI.lua)中可以访问
  • 其他文件无法直接访问这个 uinodes
  1. setmetatable

    是 Lua 的元表机制:

  • 第一个参数

{} 是创建一个空表

  • 第二个参数是元表,定义了表的特殊行为
  1. __index

    是元表的一个元方法:

  • 当访问 uinodes 中不存在的键时会触发这个函数
  • 例如:当访问

uinodes.ui 但 ui 不存在时

  1. 这个设计的作用是:

    -- 当第一次访问 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 = {}

这种设计的好处:

  1. 自动初始化:不需要手动创建子表
  2. 防止错误:访问不存在的键时不会报错
  3. 代码更简洁:减少了初始化代码
  4. 按需创建:只有被访问的键才会创建对应的表
0

评论

博主关闭了所有页面的评论