开发 / ROBLOX
Roblox ProximityPrompt:服务器何时应该允许交互
以一扇练习门为例,区分提示显示、交互事件和获准的状态修改。逐项规划角色、对象、距离与重复请求检查,并记录清楚测试条件和实际结果。
先定义一个允许执行的动作 #
准备独立的小型原型,放置一扇暂称 PracticeDoor 的练习门。第一轮练习只需要获准开门以及记录结果。先不加入货币、背包和持久化保存,这样才能看清哪个步骤改变了对象。用一句普通的话写明:什么角色在什么条件下可以开门。
例如,原型规则要求角色存活、位于可用门附近,并且已经获得练习许可。这是练习作者选择的条件,不是所有 Roblox 游戏的统一规则。本文没有启动 Studio,也没有测试已发布的游戏。我们提供的是检查自己处理流程的计划,不把未执行的步骤写成测试成功。
提示与最终决定分开 #
玩家先看到文字和按钮,再尝试交互。这些界面元素帮助理解操作,并不完整反映服务器当前记录的门、角色和许可状态。条件改变后提示仍然留在屏幕上,不能证明开门仍然获准。
画出三个阶段:界面提供操作,事件表示尝试,服务器核对规则后才修改对象。最后一个阶段也包含拒绝。这样排查问题时可以分别问:为什么服务器拒绝了尝试?为什么缺少条件仍发生了修改?比把所有问题笼统称为按钮失灵更容易定位。
明确事件的含义 #
ProximityPrompt 有多个事件。安全文档明确指出 Triggered 具有内置的服务器距离检查。不要把这一性质扩大到 PromptButtonHoldBegan 或 TriggerEnded。交互的不同阶段不能成为可以随意互换的状态修改依据。
为练习门记录处理器接收哪个事件,以及在哪一步做决定。仅显示提示或开始按住按钮,不应直接发放奖励。即便使用 Triggered,机制的其他条件仍需要核对,例如角色是否适合、对象是否可用、状态是否满足。本文没有提供适用于所有交互的通用处理器。
记录服务器目标对象 #
写明哪一扇门才是目标、它应该位于哪里、服务器用什么引用识别它。PracticeDoor 只是示例名称。同名的另一个零件不会自动成为允许修改的对象。如果门消失或离开预期结构,计划中的流程应该结束,而不是修改无关对象。
把可用状态和许可条件分别记录。使用原型服务器管理的练习标志已经足够,不需要马上制作付费权限。重点是明确许可来源以及没有许可时会怎样。每个测试案例开始前记录初始状态,避免上一次开门的残留结果被误认为新的成功。
检查角色与允许区域 #
修改门之前,通过服务器信息确定当前角色及其是否可以执行动作。角色重生或玩家离开时,旧引用可能不再代表现状。分别规划角色不存在,以及角色存在但按练习规则无法交互的情况。
定义允许区域,包含参考点、比较方法和选择的边界。不同地图没有统一适用的距离值。先准备明显靠近和明显远离的位置,再检查边界情况。一次近距离成功不能说明过远位置或角色变化后的行为,因此不能单凭这一次尝试结束验证。
考虑固定的交互点 #
如果重要交互点应该保持不动,就把它设计成通过 Anchored 固定的零件。文档提醒,移动的父零件和装配体需要考虑 network ownership。检查可移动目标的距离,与检查静止门的距离是不同的场景。
第一轮练习保持几何简单,并记录交互点的位置。移动宝箱或车辆不能一律通过固定整个装配体来解决,因为它们需要单独的物理控制设计。这里选择静止的练习门,是为了把交互许可和复杂运动分开。本文没有在正式游戏中执行网络所有权实验。
区分频率与持续时间 #
连续重复尝试,与过快完成一次需要时间的动作,是两个问题。重复尝试由服务器执行所选频率规则。如果动作要求最短持续时间,就需要核对相应的服务器条件;客户端进度动画不能证明这一要求已经满足。
测试前写清规则,包括暂停后是否允许再次尝试,以及取消意味着什么。冷却限制不能保证只发放一次奖励,它不能代替状态转换或已经接受动作的记录。对于简单门,要决定门已打开时再次开门意味着什么。本文没有指定通用时间值,也没有给出完成版的按住实现。
逐项执行测试矩阵 #
在自己的原型中先检查预计允许的情况,然后每次只改变一个条件:距离、许可、可用性或角色状态。每次尝试前后都记录门的状态。这样才能把结果对应到一个原因,而不是同时修改多个设置后猜测原因。
单项情况之后,再单独规划重复尝试和时间接近的两个允许尝试。如果机制只应发生一次,事先定义哪个变化最多只能接受一次。表格列出的是建议的预期,并不是已经完成的实验。所有练习针对自己的原型,不要为了验证本文去触发他人游戏的事件。
| 情况 | 建议预期 |
|---|---|
| 角色符合条件且靠近 | 一次预期动作 |
| 没有许可 | 不修改 |
| 门不可用 | 不修改 |
| 重复过快 | 执行服务器频率规则 |
清楚记录服务器结果 #
日志需要初始条件、收到的事件、接受或拒绝原因,以及门实际发生的变化。客户端可以向玩家说明门不可用,但检查记录必须把提示文字与服务器结果区分开。门没有变化时,屏幕上的“已打开”不能证明实际开门。
使用简短原因,例如对象不可用、角色不适合、距离过远、没有许可或重复过快。公开提示不需要泄露项目内部秘密。排查时,把案例对应到有关规则步骤即可。还要单独标记服务器接受尝试后执行失败的情况,因为授权和执行是不同阶段。
写明结论范围 #
练习应留下可以检查的交互规则,以及你自己的观察记录。真正执行后,区分通过、需要修改和仍未检查的案例。正常开门一次,或界面没有明显报错,都不能证明整套机制已经安全。
奖励、购买、持久化和多个服务器需要额外场景。本文没有修改我们的游戏代码,没有实际发放物品,也没有 Studio 实验结果。原创图示解释决定阶段和条件记录。把规则移入更大项目之前,需要检查它与项目自身逻辑的连接以及重复动作行为。
| 记录 | 保存内容 |
|---|---|
| 开始 | 角色、门与初始条件 |
| 事件 | 准确名称与上下文 |
| 决定 | 接受或拒绝原因 |
| 修改 | 实际修改前后状态 |
原始资料
Roblox Creator Hub — Securing the client-server boundaryRoblox Creator Hub — ProximityPrompt API