Roblox Guidebook知识库
简体中文 ⌄

开发 / ROBLOX

Roblox ProximityPrompt:服务器何时应该允许交互

以一扇练习门为例,区分提示显示、交互事件和获准的状态修改。逐项规划角色、对象、距离与重复请求检查,并记录清楚测试条件和实际结果。

更新日期:

先定义一个允许执行的动作 #

准备独立的小型原型,放置一扇暂称 PracticeDoor 的练习门。第一轮练习只需要获准开门以及记录结果。先不加入货币、背包和持久化保存,这样才能看清哪个步骤改变了对象。用一句普通的话写明:什么角色在什么条件下可以开门。

例如,原型规则要求角色存活、位于可用门附近,并且已经获得练习许可。这是练习作者选择的条件,不是所有 Roblox 游戏的统一规则。本文没有启动 Studio,也没有测试已发布的游戏。我们提供的是检查自己处理流程的计划,不把未执行的步骤写成测试成功。

提示与最终决定分开 #

玩家先看到文字和按钮,再尝试交互。这些界面元素帮助理解操作,并不完整反映服务器当前记录的门、角色和许可状态。条件改变后提示仍然留在屏幕上,不能证明开门仍然获准。

画出三个阶段:界面提供操作,事件表示尝试,服务器核对规则后才修改对象。最后一个阶段也包含拒绝。这样排查问题时可以分别问:为什么服务器拒绝了尝试?为什么缺少条件仍发生了修改?比把所有问题笼统称为按钮失灵更容易定位。

从尝试到获准执行打开大图 ↗
原创决定流程图。界面显示不等于服务器授权。

明确事件的含义 #

ProximityPrompt 有多个事件。安全文档明确指出 Triggered 具有内置的服务器距离检查。不要把这一性质扩大到 PromptButtonHoldBegan 或 TriggerEnded。交互的不同阶段不能成为可以随意互换的状态修改依据。

为练习门记录处理器接收哪个事件,以及在哪一步做决定。仅显示提示或开始按住按钮,不应直接发放奖励。即便使用 Triggered,机制的其他条件仍需要核对,例如角色是否适合、对象是否可用、状态是否满足。本文没有提供适用于所有交互的通用处理器。

记录服务器目标对象 #

写明哪一扇门才是目标、它应该位于哪里、服务器用什么引用识别它。PracticeDoor 只是示例名称。同名的另一个零件不会自动成为允许修改的对象。如果门消失或离开预期结构,计划中的流程应该结束,而不是修改无关对象。

把可用状态和许可条件分别记录。使用原型服务器管理的练习标志已经足够,不需要马上制作付费权限。重点是明确许可来源以及没有许可时会怎样。每个测试案例开始前记录初始状态,避免上一次开门的残留结果被误认为新的成功。

检查角色与允许区域 #

修改门之前,通过服务器信息确定当前角色及其是否可以执行动作。角色重生或玩家离开时,旧引用可能不再代表现状。分别规划角色不存在,以及角色存在但按练习规则无法交互的情况。

定义允许区域,包含参考点、比较方法和选择的边界。不同地图没有统一适用的距离值。先准备明显靠近和明显远离的位置,再检查边界情况。一次近距离成功不能说明过远位置或角色变化后的行为,因此不能单凭这一次尝试结束验证。

考虑固定的交互点 #

如果重要交互点应该保持不动,就把它设计成通过 Anchored 固定的零件。文档提醒,移动的父零件和装配体需要考虑 network ownership。检查可移动目标的距离,与检查静止门的距离是不同的场景。

第一轮练习保持几何简单,并记录交互点的位置。移动宝箱或车辆不能一律通过固定整个装配体来解决,因为它们需要单独的物理控制设计。这里选择静止的练习门,是为了把交互许可和复杂运动分开。本文没有在正式游戏中执行网络所有权实验。

区分频率与持续时间 #

连续重复尝试,与过快完成一次需要时间的动作,是两个问题。重复尝试由服务器执行所选频率规则。如果动作要求最短持续时间,就需要核对相应的服务器条件;客户端进度动画不能证明这一要求已经满足。

测试前写清规则,包括暂停后是否允许再次尝试,以及取消意味着什么。冷却限制不能保证只发放一次奖励,它不能代替状态转换或已经接受动作的记录。对于简单门,要决定门已打开时再次开门意味着什么。本文没有指定通用时间值,也没有给出完成版的按住实现。

逐项执行测试矩阵 #

在自己的原型中先检查预计允许的情况,然后每次只改变一个条件:距离、许可、可用性或角色状态。每次尝试前后都记录门的状态。这样才能把结果对应到一个原因,而不是同时修改多个设置后猜测原因。

单项情况之后,再单独规划重复尝试和时间接近的两个允许尝试。如果机制只应发生一次,事先定义哪个变化最多只能接受一次。表格列出的是建议的预期,并不是已经完成的实验。所有练习针对自己的原型,不要为了验证本文去触发他人游戏的事件。

门的测试计划打开大图 ↗
原创的两个案例计划,不是已执行测试的结果。
情况建议预期
角色符合条件且靠近一次预期动作
没有许可不修改
门不可用不修改
重复过快执行服务器频率规则

清楚记录服务器结果 #

日志需要初始条件、收到的事件、接受或拒绝原因,以及门实际发生的变化。客户端可以向玩家说明门不可用,但检查记录必须把提示文字与服务器结果区分开。门没有变化时,屏幕上的“已打开”不能证明实际开门。

使用简短原因,例如对象不可用、角色不适合、距离过远、没有许可或重复过快。公开提示不需要泄露项目内部秘密。排查时,把案例对应到有关规则步骤即可。还要单独标记服务器接受尝试后执行失败的情况,因为授权和执行是不同阶段。

写明结论范围 #

练习应留下可以检查的交互规则,以及你自己的观察记录。真正执行后,区分通过、需要修改和仍未检查的案例。正常开门一次,或界面没有明显报错,都不能证明整套机制已经安全。

奖励、购买、持久化和多个服务器需要额外场景。本文没有修改我们的游戏代码,没有实际发放物品,也没有 Studio 实验结果。原创图示解释决定阶段和条件记录。把规则移入更大项目之前,需要检查它与项目自身逻辑的连接以及重复动作行为。

记录保存内容
开始角色、门与初始条件
事件准确名称与上下文
决定接受或拒绝原因
修改实际修改前后状态

原始资料

Roblox Creator Hub — Securing the client-server boundary
Roblox Creator Hub — ProximityPrompt API