在 Roblox Lua 中按下某个键并且您与某个物体的距离达到一定值时运行脚本

我正在尝试在 Roblox 中编写一个脚本,使得当您与一个物体的距离达到 20 个 Studs 并按下 E 键时它会弹出一个 NPC 对话框。脚本运行在一个 LocalScript 中。目前,我只需要在按下 E 键时显示一条消息,但它并没有显示。

local HumanoidRootPart = game.Players.LocalPlayer:WaitForChild("HumanoidRootPart")
local UserInputService = game:GetService("UserInputService")
local part = game.workspace.TableBox.TableTop

UserInputService.InputBegan:connect(function(keyCode)
    if keyCode.keyCode == Enum.KeyCode.E then
        if (part.Position - HumanoidRootPart.Position).magnitude < 20 then
            print("E has been pressed")
        end
    end
end)

此外,我在输出中收到以下错误(橙色):

在 'Players.icrann:WaitForChild("HumanoidRootPart")' 上可能会有无限制的产出

我期望local HumanoidRootPart = game.Players.LocalPlayer.Character:WaitForChild("HumanoidRootPart")可以工作,但却出现了以下错误信息:

Players.icrann.PlayerScripts.Script: 1:尝试索引字段 'Character' (为空值)

在我玩游戏时,我的角色在资源管理器中看起来像这样:

[![Explorer](https://i.stack.imgur.com/4CIgy.png)](https://i.stack.imgur.com/4CIgy.png)

点赞
用户12839543
用户12839543
# 将下面翻译成中文并且保留原本的 markdown 格式

```lua
local Player = game:GetService("Players").LocalPlayer
local character = Player.Character or Player.CharacterAdded:Wait()
local HumanoidRootPart = character:WaitForChild("HumanoidRootPart")

将其替换为 HumanoidRootPart。 ```

2020-03-14 19:56:30
用户11521654
用户11521654

经过多个小时的研究,我发现了一种方法来实现这个,虽然它不是100%可行,但已经接近完成了。

local HumanoidRootPart = workspace.icrann:WaitForChild("HumanoidRootPart")
local UserInputService = game:GetService("UserInputService")
local part = workspace.TableBox.TableTop

UserInputService.InputBegan:connect(function(keyCode)
    print(HumanoidRootPart.Position)
    if keyCode.keyCode == Enum.KeyCode.E and (part.Position - HumanoidRootPart.Position).magnitude <= 20 then
        print("E has been pressed")
    end
end)

现在唯一的问题是如何获取玩家的用户名。如果您有任何额外建议,请添加评论或回答。感谢所有尝试帮助的人。

2020-03-14 23:26:38
用户16843365
用户16843365
local HumanoidRootPart = game:GetService("Players").LocalPlayer:WaitForChild("HumanoidRootPart") -- 因为是本地客户端玩家,所以使用.LocalPlayer
local UserInputService = game:GetService("UserInputService")
local part = workspace.TableBox.TableTop

UserInputService.InputBegan:connect(function(keyCode)
    print(HumanoidRootPart.Position)
    if keyCode.keyCode == Enum.KeyCode.E and (part.Position - HumanoidRootPart.Position).magnitude <= 20 then
        print("E has been pressed")
    end
end)
2021-09-06 13:27:48