You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ModuleScript中Worker变量赋值后仍返回nil的问题排查

问题分析与解决

你的问题核心是ModuleScript中的Worker属性赋值后未生效,打印仍为nil,可以从以下几个方向排查和修复:

1. 先确认赋值代码是否真的执行

在Touched事件的赋值代码前后加打印,验证逻辑是否走到了赋值步骤:

button.Touched:Connect(function(plr)
    if (plr.Parent:WaitForChild("Humanoid")) then
        local player = plr.Parent
        print("触发赋值,player为:", player) -- 确认player有效
        moduleTable.Worker = player
        print("赋值后Worker的值:", moduleTable.Worker) -- 立刻打印看是否生效
        workersGUI:FireAllClients()
        
        buttonModule.SwitchOn(button)
        buttonModule.Player = player
    end
end)

如果这两个打印都能输出正确的player对象,说明赋值本身没问题,问题出在你后续读取Worker的地方。

2. 确保读取的是同一个Module实例

Roblox的ModuleScript是单例模式,第一次require后会缓存实例,后续require都会返回同一个表。但如果你的读取代码中:

  • 错误地重新创建了新表(比如在另一个脚本里写了local workModule = {Worker = nil}而不是require)
  • 或者require的路径和赋值时的路径不一致(比如拼写错误,或者Part被移动了位置)

都会导致读取到的是不同的表,自然拿不到赋值后的值。检查所有读取Worker的代码,确保都是通过require(workspace.Part.ModuleScript)获取实例。

3. 改用方法封装(更稳妥的写法)

直接修改表属性本身没问题,但用方法封装可以避免一些潜在的引用问题,同时让代码更清晰:

修改ModuleScript:

local workModule = {
    ["Worker"] = nil
}

-- 设置Worker
function workModule:SetWorker(player)
    self.Worker = player
end

-- 获取Worker
function workModule:GetWorker()
    return self.Worker
end

return workModule

修改Set脚本中的赋值代码:

moduleTable:SetWorker(player)

后续读取时用moduleTable:GetWorker(),确保每次拿到的都是最新值。

4. 排查Player对象的有效性

虽然你判断了Humanoid的存在,但仍可能出现player不是有效玩家模型的情况(比如某些NPC的触发)。可以再加一层判断,确保是玩家:

local Players = game:GetService("Players")
local playerInstance = Players:GetPlayerFromCharacter(player)
if playerInstance then
    moduleTable.Worker = playerInstance -- 也可以选择存储玩家实例而非模型
end

存储玩家实例(Players服务中的对象)比存储角色模型更稳妥,因为角色模型可能会因重生而销毁。

内容的提问来源于stack exchange,提问作者JMAS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:52:32