Skip to main content

Unity 事件系统

ClientSim 使用两个类将操作转换为 Unity 的 EventSystem。这些类将 Unity 的旧输入系统解耦为基于 ClientSim 当前绑定的值,并匹配 VRChat 的交互式 UI 对象过滤。

BaseInput​

ClientSimBaseInput 系统扩展了 Unity 的 BaseInput 类。Unity 的 BaseInput 负责将鼠标位置和按钮输入传递到 EventSystem。ClientSim BaseInput 系统覆盖了这些方法,改为基于当前 ClientSim 输入绑定和上次 PlayerRaycaster 结果传递值。鼠标输入被替换为当前绑定的使用输入。由于使用输入是手部动作,只有最后激活的手的值作为鼠标输入传递。发送到事件系统的鼠标位置忽略实际鼠标位置,而是计算最后一次交互射线投射的屏幕位置。使用射线投射位置抽象出真实鼠标的位置,允许桌面和 VR 通过同一系统使用 Unity UI。 BaseInput 系统还负责向 ClientSim 的其他部分提供当前鼠标位置。它控制鼠标指针是隐藏并锁定到屏幕中心,还是可见并可自由移动。此鼠标位置用于显示桌面准星以及使用鼠标为 DesktopRayProvider 创建射线方向。

InputModule​

ClientSimInputModule 扩展了 Unity 的 StandaloneInputModule。此系统处理 Unity 鼠标事件并过滤掉当前不可交互的 UI 对象。当满足以下所有条件时,UI 对象是可交互的:

  1. PlayerRaycaster 最后命中具有 VRC_UIShape 组件的对象。此数据通过 ClientSimBaseInput 提供。
  2. UI 对象在其父级中具有 UIShape 组件
  3. 父级 UIShape 对象的层级位于当前可交互的层级上。可交互层级由 InteractiveLayerProvider 确定。
  4. UI 对象射线投射的命中点包含在 UIShape 的碰撞器内。如果任何条件失败,则无法与 UI 交互。