综述
XR Push Button 组件是Unity XR Interaction Toolkit包中示例项目提供的脚本组件,用于模拟按钮按压功能。脚本继承了XR Base Interactable,其拥有可交互对象的基本属性。
Unity XR Interaction Toolkit的示例项目中提供了大量常用VR交互场景,例如按钮、旋钮、转盘、开关把手等等,其封装的功能脚本,可以基本满足日常开发需求。秉着不重复造轮子的原则,在开发中可直接使用示例项目中给出的脚本。
[Unity XR Interaction Toolkit示例项目](GitHub - Unity-Technologies/XR-Interaction-Toolkit-Examples: This repository contains various examples to use with the XR Interaction Toolkit)
脚本属性
这里只提及XR Push Button组件特有的属性,挂载脚本后会在Scene窗口中显示按钮可视化图形,为绿色矩形。
- Button :挂载用于按压交互的具体对象。当前对象需要提前挂载Collider和# Rigidbody组件。对于Rigidbody组件需要取消勾选UseGravity属性,勾选IsKinematic属性。取消勾选UseGravity属性为了解决按键本身会因为重力作用出现的下沉现象,勾选IsKinematic属性用于模拟物理效果。
- Press Button:按钮下压的最大距离。为绿色矩形图形显示的高。
- Press Buffer:当前属性只有在勾选ToggleButton属性后才生效(也就是将按钮设置为按压下沉,再次按压复原的按钮类型),用于模拟按钮复原下压的距离。
- Press Offset:按钮按压起始位置的偏移量。当为一个按钮挂载当前脚本时,按钮模拟按压位置为当前对象的底部,可能不满足实际需求。可以通过调整组件值,调整实际需要的按钮位置。
- Button Size:按钮交互区域的大小。为绿色矩形图形显示的顶部面积。
- Toggle Button:勾选当前属性后,当前按钮变为非自复位式按钮。
- OnPress:按钮按压后触发的事件。
- OnRelease:按钮释放时触发的事件。
- OnValueChange:按钮按压距离反馈的值变化时触发的事件,在源代码中进行了归一化,值范围为0-1。
使用方法
将当前脚本挂载在按钮最外层对象中,并将实际用于交互的Button对象挂载在Button属性上。
注意点
- 如果当前按钮对象层级结构为嵌套类型可能会出现异常。
- 在嵌套类型下,挂载当前脚本时,实际用于交互的Button对象Scale和Position为非默认值会出现异常,Scale影响按压的距离,会造成Press Button的值缩放;Position会造成模拟按压位置偏移。因为在源码的199行将按钮位移的transform转为了本地坐标系。
var localOffset = transform.InverseTransformVector(interactorTransform.position - m_BaseButtonPosition);
- 解决这一问题有两种方法可以解决。第一,也就是最简单的方法,将两个子对象设为同一层级。第二,如果一定要为嵌套结构,可以通过设置新的层级结构来解决。
- 为按钮新建两个空对象为ButtonPlane和ButtonPush,将这两个对象的Transform进行Reset。再把实际可视ButtonPlaneView和ButtonPushView作为其子对象。调整ButtonPushView的位置修改到实际所需要的位置,但仅仅作为可视化功能。删除ButtonPushView中的Collider和Rigbody,为ButtonPush添加Collider和Rigbody,修改Collider的大小和位置与ButtonPushView重合,让其成为真正用于交互的对象,这样组将的初始化就完成了。
- 在XR Push Button的Button属性上挂载ButtonPush对象。