] [string "GUILayout/NPC/qiyifahshi.lua"]:52: attempt to compare number with nil
local qiyifahshi = {}
function qiyifahshi.main(param1, param2, param3, param4)
lib:Require(param1, function(state)
if state then
if param1 then
错误分析:第52行的错误 `attempt to compare number with nil` 表示你正在尝试用 nil 值与数字进行比较。在你的代码中,第52行是:
```lua
if var>=10 then
```
这里的 `var` 变量在第19行定义为:
```lua
local var = tonumber(SL:GetMetaValue("U32") or 0)
```
问题可能出现在 `SL:GetMetaValue("U32")` 返回了 nil,而 `or 0` 没有正确工作。虽然你写了 `or 0`,但如果 `SL:GetMetaValue` 返回的不是 nil 而是其他无效值,`tonumber()` 仍然可能返回 nil。
修复方案:
```lua
-- 第19行修改为更安全的写法:
local varValue = SL:GetMetaValue("U32")
local var = tonumber(varValue) or 0
-- 或者更简洁的写法:
local var = tonumber(SL:GetMetaValue("U32") or "0") or 0
```
这样确保即使 `SL:GetMetaValue("U32")` 返回 nil,也会被转换为字符串 "0",然后 `tonumber("0")` 返回 0。
另外,你的代码中还有几个逻辑问题:
1. **第20行**:`if not GUI:Win_IsNull(ui.Text_1) then` - 这个判断应该是 `GUI:Win_IsNotNull`
2. **第38行和第46行**:你在显示/隐藏按钮时逻辑有冲突。第38行根据 `isCompleted` 显示 Button_3,但第46行又根据 `var>=10` 显示 Button_3。建议统一逻辑。
建议的重构代码:
```lua
function qiyifahshi.upmain()
if not qiyifahshi.parent or not qiyifahshi.parent._ui then
return
end
-- 安全获取变量值
local varValue = SL:GetMetaValue("U32")
local var = tonumber(varValue) or 0
local ui = qiyifahshi.parent._ui
-- 更新文本显示
if GUI:Win_IsNotNull(ui.Text_1) then
GUI:Text_setString(ui.Text_1, "收集掉落的上古碎片" .. var .. "/10个")
end
-- 获取完成标志
local completionFlagValue = SL:GetMetaValue("U33")
local completionFlag = tonumber(completionFlagValue) or 0
local isCompleted = (completionFlag == 1)
-- 统一按钮显示逻辑
if GUI:Win_IsNotNull(ui.Button_1) then
GUI:setVisible(ui.Button_1, var < 10 and not isCompleted)
end
if GUI:Win_IsNotNull(ui.Button_3) then
GUI:setVisible(ui.Button_3, var >= 10 and not isCompleted)
end
if GUI:Win_IsNotNull(ui.Image_1) then
GUI:setVisible(ui.Image_1, isCompleted)
end
-- 按钮点击事件(只注册一次)
if GUI:Win_IsNotNull(ui.Button_1) then
GUI:addOnClickEvent(ui.Button_1, function()
SL:print("点击了第1个按钮,U32:"..var)
GUI:delayTouchEnabled(ui.Button_1, 0.2)
local msg = {}
msg.Script = qiyifahshi.param1
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, qiyifahshi.param2, 0, 0, jsonstr)
GUI:Win_CloseAll()
end)
end
if GUI:Win_IsNotNull(ui.Button_3) and var >= 10 and not isCompleted then
GUI:addOnClickEvent(ui.Button_3, function()
SL:print("点击了第2个按钮")
GUI:delayTouchEnabled(ui.Button_3, 0.2)
local msg = {
Script = qiyifahshi.param1,
action = 1
}
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, qiyifahshi.param2, 1, 0, jsonstr)
end)
end
end
```
主要修改:
1. 安全处理 `SL:GetMetaValue` 的返回值
2. 统一按钮显示逻辑,避免冲突
3. 修复 `GUI:Win_IsNull` 和 `GUI:Win_IsNotNull` 的使用
4. 简化条件判断
这样应该能解决你的 nil 比较错误问题。如果还有其他疑问,可以继续问我!