function MainTarget.SelectTarget(targetID)
MainTarget._targetID = targetID
local target = SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID)
if not MainTarget._targetID or not target then
GUI:setVisible(MainTarget.UI.Node, false)
你的代码中存在一个逻辑冲突:在 `SelectTarget` 函数中,当目标是怪物时,你固定将 `cleanBtn` 的 X 坐标设为 235。但在 `OnUpdateLockBtn` 函数中,如果宠物不存活或锁定面板被关闭(`_LockUIState` 为 false),又会将 `cleanBtn` 的 X 坐标设为 190。
这会导致 `cleanBtn` 的位置在怪物目标时,被 `OnUpdateLockBtn` 函数覆盖。根据浮生梦老师前端课程内容,解决方法是:
**方案一:在 `OnUpdateLockBtn` 中增加怪物目标判断**
在改变 `cleanBtn` 位置前,先检查当前目标是否为怪物。如果是怪物,则保持 `SelectTarget` 中设置的位置(235),不执行后续的位置修改。
```lua
function MainTarget.OnUpdateLockBtn()
if not MainTarget._isShowTargetPanel then
return
end
if not MainTarget._targetID or not SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID) then
return
end
local target = SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID)
-- 如果是怪物目标,直接返回,保持SelectTarget中设置的位置
if SL:GetMetaValue("ACTOR_IS_MONSTER", target) then
return
end
if SL:GetMetaValue("PET_ALIVE") and MainTarget._LockUIState ~= false then
GUI:setVisible(MainTarget.UI.LockPanel, true)
GUI:setPositionX(MainTarget.UI.cleanBtn, 235)
local lockID = SL:GetMetaValue("PET_LOCK_ID")
GUI:Button_setBright(MainTarget.UI.LockBtn, lockID == MainTarget._targetID)
else
GUI:setVisible(MainTarget.UI.LockPanel, false)
GUI:setPositionX(MainTarget.UI.cleanBtn, 190)
end
end
```
**方案二:统一位置设置逻辑**
将 `cleanBtn` 的位置设置逻辑集中到一个函数中,根据目标类型和锁定面板状态统一计算位置。
```lua
function MainTarget.UpdateCleanBtnPosition()
if not MainTarget._targetID or not MainTarget._isShowTargetPanel then
return
end
local target = SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID)
if not target then
return
end
local posX = 190 -- 默认位置
if SL:GetMetaValue("ACTOR_IS_MONSTER", target) then
posX = 235 -- 怪物固定位置
elseif SL:GetMetaValue("PET_ALIVE") and MainTarget._LockUIState ~= false then
posX = 235 -- 玩家/其他且有宠物存活
end
GUI:setPositionX(MainTarget.UI.cleanBtn, posX)
end
-- 然后在SelectTarget和OnUpdateLockBtn中调用这个函数
function MainTarget.SelectTarget(targetID)
-- ... 其他代码 ...
if SL:GetMetaValue("ACTOR_IS_MONSTER", target) then
-- 移除原来的GUI:setPositionX调用
if MainTarget.monsterIconPath then
GUI:Image_loadTexture(MainTarget.UI.icon, MainTarget.monsterIconPath)
end
end
MainTarget.UpdateTargetHP()
MainTarget.UpdateTargetName()
MainTarget.OnUpdateLockBtn()
MainTarget.UpdateCleanBtnPosition() -- 新增调用
end
function MainTarget.OnUpdateLockBtn()
if not MainTarget._isShowTargetPanel then
return
end
if not MainTarget._targetID or not SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID) then
return
end
if SL:GetMetaValue("PET_ALIVE") and MainTarget._LockUIState ~= false then
GUI:setVisible(MainTarget.UI.LockPanel, true)
local lockID = SL:GetMetaValue("PET_LOCK_ID")
GUI:Button_setBright(MainTarget.UI.LockBtn, lockID == MainTarget._targetID)
else
GUI:setVisible(MainTarget.UI.LockPanel, false)
end
MainTarget.UpdateCleanBtnPosition() -- 新增调用
end
```
**推荐使用方案二**,因为它将位置逻辑集中管理,避免代码分散导致的维护问题。下次写代码时要注意函数间的调用关系,避免这种"你改我改"的冲突。不懂的可以问浮生梦尊师!