交互系统
DVR具有一套完整统一的适用于PC、Android、VR的交互系统。
由于历史遗留原因分为新旧两个版本。
交互系统
不同的设备上具有不同的交互方式,PC上的键鼠、Pad上的触摸屏、VR上的手柄等。
DVR交互系统的目的是为了统一不同平台的交互,使得在各个平台上都具有相似的交互方式。开发者在仅需要使用DVR提供的交互系统进行开发即可同时适配PC、Pad、VR等设备
VR设备
DVR交互系统的设计参阅了Unity XRI,可以说在VR设备上的交互是建立在Unity XRI上的,因此支持完成的XRI交互功能。
其他设备
在键鼠设备和触屏设备上DVR交互系统均有独立的实现。
交互组件
交互系统由一系列的交互组件构成,有些交互组件可以直接使用。而有些为抽象组件,需要自行继承后实现对应方法来使用。
每种交互组件都有一个名为Colliders的字段暴露在属性面板中,该字段为实际参与交互的碰撞器列表(不可为触发器)。若将列表置空,将会在脚本的Awake阶段自动将该物体及其子物体上所有的非触发器类碰撞器注册到列表中。
在交互组件上右键弹出的菜单项上可快速将物体下所有非触发器的碰撞器添加到列表上。
DANGER
危险:碰撞器只能被一个交互组件所拥有,不允许多个交互组件引用同一个碰撞器。否则会导致后引用的交互组件失效。
WARNING
警告:Colliders列表在项目运行不可修改,采用非法方式修改可能导致交互失效。
基础交互
交互系统将交互过程抽象成了三个阶段:
- Hover:悬停阶段,光标或者VR手柄射线触碰
- Selected:选择阶段,光标按下或者VR手柄抓取键按下(通常为手柄侧键)
- Activate:激活阶段,该事件只有在抓取交互中可以触发。VR手柄按下扳机或捡取物体后光标按下
MKBaseInteractable
MKBaseInteractable为抽象类,它提供了这三个阶段的共6个事件的抽象函数。开发者继承并实现对应事件即可使用。
MKSimpleInteractable
MKSimpleInteractable组件提供三个阶段的6个Unity事件,监听对应事件即可使用。
WARNING
警告:上述两个组件的Activate阶段事件仅在VR下支持,若想在非VR设备下使用请参阅抓取交互
抓取交互
基础交互组件提供了交互事件和事件参数但是并未针对实际应用场景实现具体功能。抓取交互组件则是针对于抓取这个特定场景进行的定制。提供以下功能:
- 提供位置和旋转同步,并且提供了三种不同的同步模式共开发者选择。
- 支持强制抓取,VR上会将物体抓取到手柄上屏幕设备则会进入物体持有模式
- 支持自定义抓取点和动态抓取点
组件参数
- Colliders: 实际参与交互的碰撞器列表
- Selected Mode:单手或者双手,仅在VR模式下有效
- Force Attach:强制吸附,开启后在Selected触发后将会强制抓取到手上。VR设备抓取到手柄上,屏幕设备会进入FPS模式持有该物体
- Track Position:将手柄的位置应用给该物体
- Track Rotation:将手柄的旋转应用给该物体
- Throw On Detach:脱手后是否进行自由落体
- Attach Transform:抓取点,当抓取该物体后会以该位置作为和手柄移动的位置
- Use Dynamic Attach:开启动态抓取点,不使用静态抓取点而是在Selected触发的时候自动以抓取位置创建抓取点
物体持有模式
前面提到交互过程被抽象为三个阶段,在VR设备上三个阶段分别对应触碰物体、按下手柄侧键、扣动扳机
由于屏幕设备的限制,无法直接完成整个交互过程。因此,在屏幕设备上引入了物体持有模式。
该模式仅在MKGrabInteractable组件的Force Attach开启时生效。当点击该类物体后,会自动进入物体持有模式。
PC设备
PC状态下将会自动隐藏鼠标,物体会被吸附到人物手部位置,此时移动鼠标控制镜头旋转,鼠标左键激活Activate行为。
触摸屏设备
和PC类似,此时拖动屏幕控制镜头旋转,屏幕会出现丢弃和使用两个按钮
传送
用来配置那些物体可以在VR状态下使用传送器进行传送,以及传送的判定逻辑。
TIP
提示:传送组件也属于交互组件,因此不可重复引用碰撞器。
传送区域
规定那些碰撞体可以进行传送,可以使用Up Normal Tolerance Degrees来限制可传送的坡度。
传送锚点
当传送到该碰撞体上时自动将人物位置移动到锚点位置,用于实现位置吸附功能。
使用Teleportation Anchor Transform来设置锚点位置。
指针交互(Legacy)
对于弱交互的VR内容来说,点击操作通常是最理想的交互方式。因此提供了基于VR扳机按键的点击交互方式。
类似的我们提供了抽象组件MKLegacyInteractable来供开发者继承从而实现对应事件。同时也提供了MKPointerEventTrigger组件,使用Unity事件的形式提供给开发者使用。
指针交互事件:
protected abstract void PointerDown(PointerEventData pointer);
protected abstract void PointerUp(PointerEventData pointer);
protected abstract void PointerEnter(PointerEventData pointer);
protected abstract void PointerExit(PointerEventData pointer);
protected abstract void PointerClick(PointerEventData pointer);
protected abstract void PointerMove(PointerEventData pointer);
交互接口(Obsolete)
DANGER
危险:该特性在DVR包版本为1.1及以上版本已被弃用,不再被支持。如需使用请在打包DVR时将DVR包版本选择为1.0
指针交互
指针交互故名思,在VR状态下按照鼠标指针的交互逻辑实现悬停与选择的交互方式。
该交互方式直接使用Unity的EventSystem中IEventSystemHandler系列交互接口进行使用。
支持接口
接口 | 说明 |
---|---|
IPointerEnterHandler | 指针进入 |
IPointerExitHandler | 指针离开 |
IPointerClickHandler | 鼠标单击/扣动扳机 |
IPointerDownHandler | 指针按下 |
IPointerUpHandler | 指针抬起 |
抓取交互
为了实现在VR设备中能够进行抓取交互而引入的功能,该功能由接口IMkGrabEvent实现,接口定义如下表。
接口事件定义
事件 | 说明 | 参数 |
---|---|---|
OnHandEnter | 当用户手柄触摸到物体时候触发 | (Pose pose),手柄姿态 |
OnHandHold | 当用户扣动扳机抓取物品时触发 | (Pose pose),手柄姿态 |
OnHandHolding | 当物体处于抓取状态时调用(每帧调用) | (Pose pose),手柄姿态 |
OnHandRelease | 当用户松手后调用 | (Pose pose),手柄姿态 |
OnHandExits | 当用户离开物体后调用 | (Pose pose),手柄姿态 |