高级按钮事件
了解如何处理场景中的用户点击。
如果你需要场景中的交互遵循与 注册回调 或者 基于系统的 方法,你可以直接处理原始输入事件数据。这种方法最难,但也最灵活。
PointerEventsResult 组件
当引擎检测到指针事件时,被点击的实体会被分配一个 PointerEventsResult 组件。该组件包含有关命中事件的所有原始数据,并存储先前事件的历史数据。
中的辅助函数 inputSystem,例如 inputSystem.isTriggered 或 inputSystem.getInputCommand 适用于大多数简单场景,但如果你需要获取有关命中事件的更多细节,请查看 PointerEventsResult.
该 PointerEventsResult 组件保存一个指针事件列表,每个事件对应一个对象。它最多存储 100 个事件,较新的事件存放在列表末尾。一旦列表长度达到 100,它就会在每个新事件到来时丢弃旧事件。
列表中的每个事件都包含以下数据:
模拟:可选数字,仅出现在来自模拟输入(如摇杆)的事件中,用于存储输入的模拟值。按钮连接您的钱包:按下的是哪个按钮 ID。该数字对应于InputAction枚举,其中列出了所有可用按钮。state:指针事件类型,来自枚举PointerEventType. 0 指的是PointerEventType.PET_UP, 1 为PointerEventType.PET_DOWN, 2 为PointerEventType.PET_HOVER_ENTER, 3 为PointerEventType.PET_HOVER_LEAVE, 4 为PointerEventType.PET_PROXIMITY_ENTER, 5 为PointerEventType.PET_PROXIMITY_LEAVE时间戳:一个 Lamport 时间戳 用于标识每个按钮事件。注意:此时间戳并不是基于当前时间编号的。可以将其视为一个从 0 开始、每发生一个事件就加 1 的计数器。
命中:一个包含有关命中事件以下数据的对象:entityId:被射线命中的实体的 ID 数字。meshName: 字符串 ,包含被命中的 3D 模型中具体网格的内部名称。当一个 3D 模型由多个网格组成时,这很有用。globalOrigin: Vector3 用于表示射线起点的位置(相对于场景)方向: Vector3 与射线的方向向量一起,位于全局坐标中位置: Vector3 用于表示射线与命中实体相交的位置(相对于场景)length:射线从起点到命中实体发生位置的长度。normalHit: Vector3 带有一个归一化方向向量,用于描述世界空间中命中法线的角度。
跟踪玩家移动
在实时多人游戏中,如果玩家移动的时机至关重要,你可能希望使用第三方服务器作为事实来源来跟踪每个玩家的位置。你可以提前监听按钮,并在头像移动位置之前就在服务器中预测其效果,从而提高响应时间。
这种方法有助于弥补网络延迟,但肯定会导致差异,因此你也应该定期轮询玩家的当前位置以进行修正。平衡这些预测和修正可能需要大量微调。
最后更新于