距离计算器无法打印文本

我正在尝试制作一个标志,当您足够接近时,会显示出GUI。

为了测试它,我让它打印 "It works!" 但它没有打印任何东西。

LocalScript:

local Players = game:GetService('Players')
local LocalPlayer = Players.LocalPlayer

for _,Player in next, Players:GetChildren() do
    local character = Player.Character
    if character and character.Parent and Player ~= LocalPlayer then
        local Magnitude = (LocalPlayer.Character.HumanoidRootPart.Position - character.HumanoidRootPart.Position).magnitude

    end
end
while true do
    if Magnitude < 10 then
        print("它正在工作!")
    end
end

原文链接 https://stackoverflow.com/questions/70998221

点赞
stackoverflow用户2860267
stackoverflow用户2860267

问题是你将一个 LocalScript 放在 Workspace 中的一个 Part 中。如果你查看 LocalScript 文档,你会看到...

一个 LocalScript 仅会运行 Lua 代码,如果它是以下对象之一的后代:

  • 玩家的背包,例如作为工具的子对象
  • 玩家的角色模型
  • 玩家的 PlayerGui
  • 玩家的 PlayerScripts
  • ReplicatedFirst 服务

所以为了解决你的问题,你可以选择:

  • A) 将你的代码转换为一个 Script,并通过 Players 服务访问玩家对象;或者
  • B) 将 LocalScript 移动到一个可以开始执行的地方,并相应更新代码。

如果你选择方案 B,请按照以下步骤:

首先,将 LocalScript 移动到 StarterPlayer > StarterCharacterScripts 中。这将导致脚本在玩家角色生成在世界中时运行。

然后,更新代码使其能够找到方块并显示到玩家的距离。

local localPlayer = game.Players.LocalPlayer

-- 定位世界中的标牌
-- local signGui = game.Workspace:WaitForChild("Part"):WaitForChild("UI")

-- 设置标牌应该出现的距离范围
local DISTANCE_TO_SHOW_SIGN = 10 -- 学分

-- 每一帧,计算物块和角色之间的距离
game.RunService.Heartbeat:Connect(function()
    -- 如果玩家的角色不存在,则退出
    if not localPlayer.Character then
        return
    end

    -- 计算与每个玩家的距离
    -- 如果两个玩家足够接近,请显示标牌
    local shouldShowSign = false
    local myPosition = localPlayer.Character.HumanoidRootPart.Position

    for _, otherPlayer in ipairs(game.Players:GetPlayers()) do
        if (otherPlayer ~= localPlayer) and (otherPlayer.Character) then
            local theirPosition = otherPlayer.Character.HumanoidRootPart.Position
            local distBetween = (myPosition - theirPosition)

            -- 优化:在计算距离时,尽量避免使用平方根
            -- 使用勾股定理:dist = sqrt(x^2 + y^2 + z^2)
            -- 可以使用 dist^2 = x^2 + y^2 + z^2 代替
            if (distBetween * distBetween) < (DISTANCE_TO_SHOW_SIGN ^ 2) then
                shouldShowSign = true
                break
            end
        end
    end

    -- 如果两个玩家足够接近,则显示标牌
    if shouldShowSign then
        print("it's working")
    end
    -- 优化:仅在可见性更改时设置可见性
    --if signGui.Visible ~= shouldShowSign then
    --    signGui.Visible = shouldShowSign
    --end
end)
2022-02-08 18:36:57
stackoverflow用户16427076
stackoverflow用户16427076

你的代码存在三个主要问题:

1.它是一个常规脚本而不是本地脚本。

2.当服务器启动时,你的 while true do 循环会超时。

3.只有在使用 for i,v 时才会定义 Magnitude

请改为使用下面代码中的本地脚本

local Players = game:GetService('Players')
local LocalPlayer = Players.LocalPlayer
local Magnitude
while true do
    wait()
    for _,Player in next, Players:GetChildren() do
        local character = Player.Character
        if character and character.Parent and Player ~= LocalPlayer then
            Magnitude = (LocalPlayer.Character.HumanoidRootPart.Position - character.HumanoidRootPart.Position).magnitude
        end
    end

    if Magnitude ~= nil then
        if Magnitude < 10 then
            print("It's working!")
        end
    end
end
2022-02-10 12:25:22