local function onRefAttr(data)
if data and data.id == 13 then
-- 方法2:分开处理
local valueStr = data.count or "未知"
local idStr = data.id or "未知"
SL:print("货币13发生变化,新值:"..valueStr..",ID:"..idStr)
end
end
看到你的代码错误了,问题在于作用域理解有误。`onRefAttr`是一个局部函数,在按钮点击回调中无法直接访问它的内部变量。
## 问题分析:
1. `onRefAttr`函数中的`valueStr`是局部变量,只在函数执行时存在
2. 按钮点击时试图访问`onRefAttr.valueStr`,但`valueStr`不是函数的属性
3. 正确的做法是使用一个全局变量来存储货币值
## 修正后的代码:
```lua
-- 创建一个全局变量来存储货币13的值
local currency13Value = "0"
local function onRefAttr(data)
if data and data.id == 13 then
local valueStr = data.count or "0"
local idStr = data.id or "未知"
-- 更新全局变量
currency13Value = valueStr
SL:print("货币13发生变化,新值:"..valueStr..",ID:"..idStr)
end
end
SL:RegisterLUAEvent("LUA_EVENT_MONEYCHANGE", "货币变化", onRefAttr)
GUI:addOnClickEvent(chouquyici, function()
SL:SendLuaNetMsg(1111, 1, 0, 0, "抽取一次")
-- 使用全局变量,而不是函数内部变量
GUI:Text_setString(chongzhiedu, "充值额度:"..currency13Value)
end)
```
## 关键点:
1. `currency13Value` 是全局变量,可以在任何地方访问
2. `onRefAttr` 函数更新这个全局变量
3. 按钮点击时读取这个全局变量
## 如果还需要其他货币:
```lua
-- 创建货币表存储所有货币值
local currencyTable = {
[13] = "0", -- ID 13的货币
[14] = "0", -- ID 14的货币
-- 添加更多...
}
local function onRefAttr(data)
if data and data.id then
local valueStr = data.count or "0"
local idStr = data.id or "未知"
-- 更新对应ID的货币值
currencyTable[data.id] = valueStr
SL:print("货币"..idStr.."发生变化,新值:"..valueStr)
end
end
```
这样修改后就不会出现"attempt to index global 'onRefAttr' (a nil value)"的错误了。记住:函数内部的局部变量在函数执行完后就会被销毁,需要用全局变量或表来持久化存储数据。