接近事件
检测玩家何时进入或离开某个实体的接近范围。
临近交互可使实体在玩家进入附近并大致朝向它时对按钮事件作出响应,而无需玩家将光标对准该实体。
传统的指针事件使用射线投射:玩家必须先将光标对准实体的碰撞体,然后才能按下按钮触发事件。临近事件则改为检查角色周围给定区域内的实体,而不管玩家的光标指向哪里。
用于临近交互的交互区域是一个宽阔的球面三角切片,从玩家的位置向前投射。与指针事件不同,角色面朝的方向很重要,而与摄像机朝向无关。
。要设置更具体的自定义逻辑,你可能需要直接处理原始数据,并使用 高级 的方法。
要使实体可交互,它必须具有 碰撞体。参见 障碍物 了解更多详情。
注册临近回调
该 pointerEventsSystem 包含用于临近事件的辅助函数,遵循与 指针事件回调.
临近按钮按下
使用 pointerEventsSystem.onProximityDown 用于在玩家处于范围内时检测按钮按下。不同于 onPointerDown,这不需要玩家将光标对准该实体。
pointerEventsSystem.onProximityDown(
{
entity: myEntity,
opts: {
button: InputAction.IA_PRIMARY,
hoverText: '按 E',
maxDistance: 5,
},
},
function () {
console.log('玩家在实体附近按下按钮')
}
)使用 pointerEventsSystem.onProximityUp 用于检测玩家在范围内松开按钮的时机。
临近事件类型
已向 PointerEventType 枚举中使用:
PET_PROXIMITY_ENTER:当玩家走入实体的临近范围时触发。PET_PROXIMITY_LEAVE:当玩家移出实体的临近范围时触发。
这些可与一个 PointerEvents 组件以及 inputSystem 用于 基于系统的方法一起使用。该方法还支持使用临近按钮按下, InteractionType.PROXIMITY 字段中,指向你自己的流媒体基础设施。
优先级
当多个实体处于范围内且都可以响应同一输入时,默认只会激活离得最近的一个。使用 优先级 字段来控制哪个优先。具有 更高数值 作为其优先级值的实体会优先响应。
如果玩家既在某个带有临近交互的实体范围内,而玩家的光标又指向一个带有指针交互的实体,则始终优先选择带有指针交互的实体。再次强调,只会激活一个实体。
在上面的示例中,如果两个实体都在范围内,则门实体会响应,因为它的优先级更高。
该 优先级 字段也可以在一个 PointerEvents 组件。
选项
中设置。临近辅助函数接受与其指针对应函数相同的选项:
按钮连接您的钱包:要监听哪个按钮。参见 指针按钮 以查看支持的选项。maxDistance:从玩家的 化身 到实体的最大距离,单位为米。默认 10。hoverText:当玩家靠近实体时在 UI 中显示的文本。showHighlight:如果为 true,当玩家在范围内时,在实体上显示边缘高亮。 true 。showFeedback:如果为 true,显示悬停反馈,在实体中心周围悬停。 true 。优先级:当多个实体处于临近范围内时解决冲突。数值越高优先级越高。如果多个实体具有相同的优先级值,则选择最近的一个。
maxPlayerDistance 是 maxDistance。这两者都是从化身测量距离,因此请使用 maxDistance 。
什么算作在范围内
临近事件的测量起点是 玩家胶囊体的中心,大致在胸部高度,到实体碰撞体上的最近点。这比光标点击的测量起点大约高出一米,因此同一个位置在两种路径下读出的距离可能会略有不同。
仅靠距离还不够。要触发临近事件,玩家还必须:
面向 朝向 该实体,且位于其正前方大约 120 度的锥形范围内。
具有 清晰的视线 可直达它,中间没有任何遮挡。
移除回调
要移除临近回调,请使用相应的移除函数:
一旦移除,该实体将不再对该临近事件作出响应。
临近进入和离开
使用 pointerEventsSystem.onProximityEnter 用于在玩家走入实体的临近范围时运行回调,以及 pointerEventsSystem.onProximityLeave 用于在玩家走出时运行回调。这可用于向玩家显示额外的反馈提示,例如当某个物品可以交互时播放声音或动画。
示例:临近门
下面的示例会在玩家站在附近并按下按钮时打开或关闭一扇门,而无需将视线对准门。
最后更新于