local selectBtn = 0 -- 选择宝宝对应位置
local oldEffect = nil -- 宝宝对应特效对象
for i = 1, 5 do
local panel = GUI:getChildByName(npc.ui.ListView_1, "Panel_" .. i)
local babybg = GUI:getChildByName(panel, "babybg_" .. i)
local
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-06-10 22:35:36 |
👁️ 阅读: 1
你的代码问题在于`oldEffect`变量在第一次点击时为nil,导致`GUI:setVisible(oldEffect, false)`报错。
**错误分析:**
- 第1次点击时:`oldEffect = nil`,执行`GUI:setVisible(oldEffect, false)`会报"target is nil value"
- 第2次点击时:`oldEffect`才有值
**修正后的代码:**
```lua
local selectBtn = 0 -- 选择宝宝对应位置
local oldEffect = nil -- 宝宝对应特效对象
for i = 1, 5 do
local panel = GUI:getChildByName(npc.ui.ListView_1, "Panel_" .. i)
local babybg = GUI:getChildByName(panel, "babybg_" .. i)
local babyBtn = GUI:getChildByName(babybg, "babybg_btn" .. i)
local effectName = "babyEffect" .. i
local effect = GUI:getChildByName(babybg, effectName)
-- 初始化:隐藏所有特效
GUI:setVisible(effect, false)
GUI:addOnClickEvent(babyBtn, function()
if selectBtn == i then
return
else
-- 显示当前特效
GUI:setVisible(effect, true)
-- 隐藏上一个特效(如果有)
if oldEffect and not GUI:Win_IsNull(oldEffect) then
GUI:setVisible(oldEffect, false)
end
end
oldEffect = effect
selectBtn = i
end)
end
```
**关键改进:**
1. **初始化隐藏特效**:在循环开始时就隐藏所有特效,避免初始状态问题
2. **添加nil判断**:使用`GUI:Win_IsNull()`检查控件是否有效
3. **条件执行**:只有`oldEffect`不为空时才执行隐藏操作
**函数说明:**
- `GUI:Win_IsNull(widget)`:检查控件对象是否为空或无效
- `GUI:setVisible(widget, value)`:设置控件可见性,true为显示,false为隐藏
**建议:**
下次写这种交互逻辑时,记得先初始化所有控件的状态,并且对可能为nil的变量进行有效性检查。这种小细节很容易被忽略,但会导致运行时错误。
你的代码问题在于`oldEffect`变量在第一次点击时为nil,导致`GUI:setVisible(oldEffect, false)`报错。
**错误分析:**
- 第1次点击时:`oldEffect = nil`,执行`GUI:setVisible(oldEffect, false)`会报"target is nil value"
- 第2次点击时:`oldEffect`才有值
**修正后的代码:**
```lua
local selectBtn = 0 -- 选择宝宝对应位置
local oldEffect = nil -- 宝宝对应特效对象
for i = 1, 5 do
local panel = GUI:getChildByName(npc.ui.ListView_1, "Panel_" .. i)
local babybg = GUI:getChildByName(panel, "babybg_" .. i)
local babyBtn = GUI:getChildByName(babybg, "babybg_btn" .. i)
local effectName = "babyEffect" .. i
local effect = GUI:getChildByName(babybg, effectName)
-- 初始化:隐藏所有特效
GUI:setVisible(effect, false)
GUI:addOnClickEvent(babyBtn, function()
if selectBtn == i then
return
else
-- 显示当前特效
GUI:setVisible(effect, true)
-- 隐藏上一个特效(如果有)
if oldEffect and not GUI:Win_IsNull(oldEffect) then
GUI:setVisible(oldEffect, false)
end
end
oldEffect = effect
selectBtn = i
end)
end
```
**关键改进:**
1. **初始化隐藏特效**:在循环开始时就隐藏所有特效,避免初始状态问题
2. **添加nil判断**:使用`GUI:Win_IsNull()`检查控件是否有效
3. **条件执行**:只有`oldEffect`不为空时才执行隐藏操作
**函数说明:**
- `GUI:Win_IsNull(widget)`:检查控件对象是否为空或无效
- `GUI:setVisible(widget, value)`:设置控件可见性,true为显示,false为隐藏
**建议:**
下次写这种交互逻辑时,记得先初始化所有控件的状态,并且对可能为nil的变量进行有效性检查。这种小细节很容易被忽略,但会导致运行时错误。
← 返回问答库