您可以创建互动接近提示,当用户接近3D空间中的对象时显示,然后根据用户输入触发动作。
本教程使用 Dungeon Delve 项目作为展示。要跟随本教程,请在继续之前在Studio中打开该项目。

创建提示
屏幕上显示的提示由父级为 Attachment、BasePart 或 Model 的 ProximityPrompt 对象生成。
在3D视图或 Explorer 中选择 PrisonDoor 模型 (Workspace → PromptObjects → PrisonDoor)。


展开其树状结构并选择 Door 对象。

将提示放置在 Attachment 上,可以更好地控制交互发生的位置,而不是直接放置在部件/模型上。插入一个新的 Attachment 并将其重命名为 PromptAttachment。

找到新附件的 Position 属性,并将其设置为 -2.25, -0.5, -0.5。这会将其移动到门的钥匙孔前面。


悬停在 PromptAttachment 上并插入一个新的 ProximityPrompt 对象。

提示外观
提示由三个主要元素组成,每个元素可以通过以下属性进行控制:

- ObjectText — 与之交互的对象的可选名称。
- ActionText — 显示给用户的可选动作名称。
- KeyboardKeyCode — 将触发提示的键盘按键。
- GamepadKeyCode — 将触发提示的手柄按钮。
要自定义监狱门提示的外观,请进行以下更改:
在 Properties 窗口中,找到 ObjectText 属性并输入 Door。

对于 ActionText 属性,输入 Pick Lock。

激活距离
当用户的 character 移动到提示对象父级的定义 MaxActivationDistance 范围内时,提示会显示。

默认值在大多数情况下效果良好,但您可以通过将 MaxActivationDistance 更改为 4,将用户交互推近到锁的地方。

持续时间
HoldDuration 属性值决定了提示的动作被触发的速度,单位为秒。由于必须选择此门以解锁,请将 HoldDuration 属性更改为 4。

实现动作
检测提示事件的最佳方式是通过 ProximityPromptService — 这使您可以集中检测事件,而无需在每个提示对象上附加脚本。
基本框架如下:
local ProximityPromptService = game:GetService("ProximityPromptService")
-- 检测何时触发提示
local function onPromptTriggered(promptObject, player)
end
-- 检测何时开始按住提示
local function onPromptHoldBegan(promptObject, player)
end
-- 检测何时结束按住提示
local function onPromptHoldEnded(promptObject, player)
end
-- 将提示事件连接到处理函数
ProximityPromptService.PromptTriggered:Connect(onPromptTriggered)
ProximityPromptService.PromptButtonHoldBegan:Connect(onPromptHoldBegan)
ProximityPromptService.PromptButtonHoldEnded:Connect(onPromptHoldEnded)
| 事件 | 描述 |
|---|---|
| PromptTriggered | 在用户与提示交互时触发 (在 持续时间之后,针对非零的 HoldDuration)。 |
| PromptButtonHoldBegan | 在用户开始与非零 HoldDuration 的提示交互时触发。 |
| PromptButtonHoldEnded | 在用户停止与非零 HoldDuration 的提示交互时触发 |
在 Dungeon Delve 项目中,这些事件由 ServerScriptService 中的 PromptEvents 脚本管理。

在脚本内部,上述事件简单调用位于 ServerScriptService 中的 ObjectActions ModuleScript 中的函数。
local ProximityPromptService = game:GetService("ProximityPromptService")
local ServerScriptService = game:GetService("ServerScriptService")
local ObjectActions = require(ServerScriptService.ObjectActions)
-- 检测何时触发提示
local function onPromptTriggered(promptObject, player)
ObjectActions.promptTriggeredActions(promptObject, player)
end
-- 检测何时开始按住提示
local function onPromptHoldBegan(promptObject, player)
ObjectActions.promptHoldBeganActions(promptObject, player)
end
-- 检测何时结束按住提示
local function onPromptHoldEnded(promptObject, player)
ObjectActions.promptHoldEndedActions(promptObject, player)
end
-- 将提示事件连接到处理函数
ProximityPromptService.PromptTriggered:Connect(onPromptTriggered)
ProximityPromptService.PromptButtonHoldBegan:Connect(onPromptHoldBegan)
ProximityPromptService.PromptButtonHoldEnded:Connect(onPromptHoldEnded)
接近提示是游戏中对象交互的方便且可定制的解决方案。查看 ProximityPrompt 和 ProximityPromptService 参考页面以获取更多控制提示行为的方法,并在 Dungeon Delve 中探索其他互动对象,以获取创意灵感。