if a == 1 then
local action_1 =GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 100), GUI:ActionMoveTo(0.2, 401, 127))
local action_2 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 80), GUI:ActionMoveTo(0.2, 32, 127))
local action_3 = GUI:Ac
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-27 20:10:11 |
👁️ 阅读: 4
你的代码有两个主要问题,导致了 `runAction` 的参数无效(`nullptr`)错误:
**问题1:动作对象创建时机不当**
你提前创建了动作对象 `action_1`, `action_2`, `action_3`,然后在 `addOnClickEvent` 的回调函数中使用。如果点击事件触发时,这些动作对象已经失效或不在有效作用域内,就会变成空对象。应该将动作的创建放在回调函数内部。
**问题2:缺少对UI组件的空值判断**
在调用 `GUI:runAction` 之前,没有检查 `npc.ui.Effect_1` 等控件对象是否存在。如果这些控件是 `nil`,也会导致错误。
**修正后的代码:**
```lua
if a == 1 then
GUI:addOnClickEvent(npc.ui.Image_1, function()
-- 先检查控件是否存在
if GUI:Win_IsNull(npc.ui.Effect_1) or
GUI:Win_IsNull(npc.ui.Effect_2) or
GUI:Win_IsNull(npc.ui.Effect_3) then
SL:print("特效控件不存在,无法执行动作")
return
end
-- 在回调函数内部创建动作对象,确保作用域有效
local action_1 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 100), GUI:ActionMoveTo(0.2, 401, 127))
local action_2 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 80), GUI:ActionMoveTo(0.2, 32, 127))
local action_3 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 50), GUI:ActionMoveTo(0.2, 217, 86))
GUI:runAction(npc.ui.Effect_1, action_1)
GUI:runAction(npc.ui.Effect_2, action_2)
GUI:runAction(npc.ui.Effect_3, action_3)
end)
end
```
**关键改进点:**
1. **动作创建时机**:将 `GUI:ActionSpawn` 等动作创建函数移到点击回调函数内部,确保每次点击都创建新的有效动作对象
2. **空值检查**:使用 `GUI:Win_IsNull(widget)` 检查控件是否存在,这是996引擎推荐的检查方式
3. **错误处理**:添加了错误提示,当控件不存在时打印日志并返回,避免继续执行导致错误
记住,在996引擎中操作UI控件前,一定要先用 `GUI:Win_IsNull()` 检查控件是否有效,这是避免空指针错误的良好编程习惯。
你的代码有两个主要问题,导致了 `runAction` 的参数无效(`nullptr`)错误:
**问题1:动作对象创建时机不当**
你提前创建了动作对象 `action_1`, `action_2`, `action_3`,然后在 `addOnClickEvent` 的回调函数中使用。如果点击事件触发时,这些动作对象已经失效或不在有效作用域内,就会变成空对象。应该将动作的创建放在回调函数内部。
**问题2:缺少对UI组件的空值判断**
在调用 `GUI:runAction` 之前,没有检查 `npc.ui.Effect_1` 等控件对象是否存在。如果这些控件是 `nil`,也会导致错误。
**修正后的代码:**
```lua
if a == 1 then
GUI:addOnClickEvent(npc.ui.Image_1, function()
-- 先检查控件是否存在
if GUI:Win_IsNull(npc.ui.Effect_1) or
GUI:Win_IsNull(npc.ui.Effect_2) or
GUI:Win_IsNull(npc.ui.Effect_3) then
SL:print("特效控件不存在,无法执行动作")
return
end
-- 在回调函数内部创建动作对象,确保作用域有效
local action_1 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 100), GUI:ActionMoveTo(0.2, 401, 127))
local action_2 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 80), GUI:ActionMoveTo(0.2, 32, 127))
local action_3 = GUI:ActionSpawn(GUI:ActionScaleTo(0.2, 50), GUI:ActionMoveTo(0.2, 217, 86))
GUI:runAction(npc.ui.Effect_1, action_1)
GUI:runAction(npc.ui.Effect_2, action_2)
GUI:runAction(npc.ui.Effect_3, action_3)
end)
end
```
**关键改进点:**
1. **动作创建时机**:将 `GUI:ActionSpawn` 等动作创建函数移到点击回调函数内部,确保每次点击都创建新的有效动作对象
2. **空值检查**:使用 `GUI:Win_IsNull(widget)` 检查控件是否存在,这是996引擎推荐的检查方式
3. **错误处理**:添加了错误提示,当控件不存在时打印日志并返回,避免继续执行导致错误
记住,在996引擎中操作UI控件前,一定要先用 `GUI:Win_IsNull()` 检查控件是否有效,这是避免空指针错误的良好编程习惯。
← 返回问答库