注册回调
了解如何处理场景中的用户点击。
处理按钮事件最简单的方法,是为某个实体注册一个回调函数。每当使用特定按钮与该实体交互时,就会调用这个回调函数。
如果你需要为多个相似实体添加相同的行为,可以考虑使用 基于系统的 方法,而不是为每个实体添加回调。随着你遍历相似实体列表,基于系统的方法通常会更高效。
注册回调的方法尤其适合用来描述影响单个实体的行为,因为它更直接。
指针按下
使用 pointerEventsSystem.onPointerDown() 以检测特定按钮的按下。
该语句需要两个参数:
数据:包含以下内容的对象:实体:要处理的实体opts:一个带有可选附加数据的对象:button:要监听哪个按钮。参见 指针按钮 了解受支持的选项。如果未指定按钮,则会监听所有按钮,包括前进和跳跃之类的移动按钮。maxDistance:实体与玩家 化身之间的最大距离,单位为米。默认值为 10。参见 距离限制.maxCameraDistance:实体与 活动摄像机之间的最大距离,单位为米。默认未设置。参见 距离限制.hoverText:在悬停反馈提示中显示的字符串内容。默认值为“交互”。showFeedback:如果为 false,则会同时隐藏该实体的悬停提示和边缘高亮。 true 。showHighlight:如果为 true,当玩家将光标悬停在实体上时,会看到边缘高亮。 true 默认值。仅当showFeedback为 true.
cb:每当指向实体时发生按下按钮事件,就运行一次的回调函数
上述命令会保留已注册的回调函数,并且每次发生相关按钮事件时都会调用它。请注意,回调必须是同步函数; 异步 函数在这里不受支持,并且会导致错误。
悬停反馈
让玩家知道某个实体可以交互,这一点非常重要。
当使用 EventsSystem注册输入动作时,默认情况下玩家将看到:
实体上的边缘高亮
光标附近的一个悬停提示,带有他们需要按下的按钮图标,以及显示“Interact”的字符串。
这些元素都可以切换开关并自定义。
UI 上的悬停反馈会根据你在 button 字段中选择的输入而显示不同的图标。在 PC 上,它会显示一个 E 用于 InputAction.IA_PRIMARY,一个 F 用于 用于InputAction.IA_SECONDARY 的鼠标,以及一个鼠标用于.
通过修改 hoverText 值来更改字符串。保持此字符串简短,以便快速阅读,并且不会对屏幕造成太大干扰。
要隐藏悬停提示但保留边缘高亮,请将 hoverText 的值设为“”。
要隐藏边缘高亮但保留悬停提示,请设置 showHighlight 为 false.
要同时隐藏悬停提示和边缘高亮,请设置 showFeedback 为 false。执行此操作时,光标不会显示任何图标、文本或边缘高亮。
更改现有反馈
当使用 EventsSystem,这会在后台创建一个 PointerEvents 组件并将其添加到可交互实体中。该组件负责处理 UI 悬停提示的行为。要更改悬停反馈的行为,请修改此组件。参见 显示反馈 ,了解如何处理此组件。
距离限制
默认情况下,玩家只有在其 化身 化身距离实体 10 米以内时才能与之交互。如果玩家离得太远,实体的高亮效果会变成红色而不是绿色,并且不会触发指针事件。
使用 maxDistance 来更改该范围:
按摄像机距离限制
maxCameraDistance 从 当前活动摄像机 而不是头像进行测量。当你的场景使用一个 虚拟摄像机 放置在玩家远处的摄像机,并且你希望实体是否可点击取决于摄像机能看到什么时,这很有用。
两种限制如何组合
这两个选项是独立检查。实际运行哪些检查取决于你设置了什么:
都不设置
化身在 10 米以内(默认值)
maxDistance 仅
化身在 maxDistance
maxCameraDistance 仅
摄像机在 maxCameraDistance
两者都满足
任一满足 任一检查通过即可
同时设置两者,表示“足够近,可以走过去, 或 也足够近,可以清楚地看到它”:
maxPlayerDistance 已弃用
maxPlayerDistance 是 maxDistance的弃用别名:二者都从头像测量距离。在新场景中请使用 maxDistance 。
如果场景同时设置了两者,则会使用 较大的 那个作为头像距离限制。
指针抬起
使用 pointerEventsSystem.onPointerUp 用于注册一个回调函数,当指定玩家在指向实体时松开按钮时会调用该函数。
该语句需要两个参数:
cb:每当指向实体时发生按钮抬起事件,就运行一次的回调函数。
同一个实体可以注册两个不同的回调,一个用于 pointerEventsSystem.onPointerDown ,一个用于 pointerEventsSystem.onPointerUp。每种回调实体只能注册一个, 处理多个按钮 ,以便在同一个回调中检测不同按钮。
悬停进入与离开
使用 pointerEventsSystem.onPointerHoverEnter 用于在玩家光标开始指向某个实体时运行回调, pointerEventsSystem.onPointerHoverLeave 用于在光标停止指向它时运行回调。
这些回调对于自定义悬停效果很有用,例如当玩家瞄准实体时播放声音或为实体播放动画。
移除回调
要移除回调函数,请使用相应的移除函数:
移除后,实体上的悬停反馈应不再显示,并且该实体也应不再可交互。
每个移除函数只会移除其对应注册函数添加的那条记录。反复注册并移除同一个回调不会在实体上留下过期条目。
近距离交互
对于基于玩家接近而不是光标瞄准触发的交互,请参见 近距离事件。 pointerEventsSystem 包括等效的辅助函数(onProximityDown, onProximityUp, onProximityEnter、以及 onProximityLeave),其模式与本页描述的函数相同。
同一个实体可以同时拥有一个光标处理器和一个近距离处理器来处理同一事件类型。两个回调都会运行,各自在自己的条件满足时触发。
来自输入动作的数据
获取来自输入动作的数据,例如按下的按钮、被击中的实体、射线的方向和长度等。参见(查看文档)以了解所有可用数据的说明。
要获取这些数据,请向回调函数传递一个参数。该参数包含输入事件的完整数据结构。
处理多个按钮
你不能注册超过一个 onPointerDown 在单个实体上。理想情况下,你应该使用 基于系统的 方法,因为这样你可以按需处理尽可能多的不同输入,并为每个按钮显示一个 UI 悬停反馈提示。
作为替代,你可以使用注册回调的方法,并将 button 字段设为 InputAction.IA_ANY.
这种方法并不理想,因为悬停提示只会显示一个字符串,不会说明要激活什么动作。请注意,这会让回调函数对每个输入动作都运行,包括移动键,因此你必须只筛选出你关心的动作。
最后更新于