【Unity XR】XR Push Button组件的使用和注意点

1,025 阅读3分钟

综述

XR Push Button 组件是Unity XR Interaction Toolkit包中示例项目提供的脚本组件,用于模拟按钮按压功能。脚本继承了XR Base Interactable,其拥有可交互对象的基本属性。

Unity XR Interaction Toolkit的示例项目中提供了大量常用VR交互场景,例如按钮、旋钮、转盘、开关把手等等,其封装的功能脚本,可以基本满足日常开发需求。秉着不重复造轮子的原则,在开发中可直接使用示例项目中给出的脚本。

屏幕截图 2024-06-23 154947.png

[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窗口中显示按钮可视化图形,为绿色矩形。

屏幕截图 2024-06-23 163906.png

  • Button :挂载用于按压交互的具体对象。当前对象需要提前挂载Collider和# Rigidbody组件。对于Rigidbody组件需要取消勾选UseGravity属性,勾选IsKinematic属性。取消勾选UseGravity属性为了解决按键本身会因为重力作用出现的下沉现象,勾选IsKinematic属性用于模拟物理效果。
  • Press Button:按钮下压的最大距离。为绿色矩形图形显示的高。
  • Press Buffer:当前属性只有在勾选ToggleButton属性后才生效(也就是将按钮设置为按压下沉,再次按压复原的按钮类型),用于模拟按钮复原下压的距离。
  • Press Offset:按钮按压起始位置的偏移量。当为一个按钮挂载当前脚本时,按钮模拟按压位置为当前对象的底部,可能不满足实际需求。可以通过调整组件值,调整实际需要的按钮位置。
  • Button Size:按钮交互区域的大小。为绿色矩形图形显示的顶部面积。
  • Toggle Button:勾选当前属性后,当前按钮变为非自复位式按钮。
  • OnPress:按钮按压后触发的事件。
  • OnRelease:按钮释放时触发的事件。
  • OnValueChange:按钮按压距离反馈的值变化时触发的事件,在源代码中进行了归一化,值范围为0-1。

屏幕截图 2024-06-23 172056.png

使用方法

将当前脚本挂载在按钮最外层对象中,并将实际用于交互的Button对象挂载在Button属性上。

注意点

  • 如果当前按钮对象层级结构为嵌套类型可能会出现异常。

屏幕截图 2024-06-23 170343.png 屏幕截图 2024-06-23 170306.png

  • 在嵌套类型下,挂载当前脚本时,实际用于交互的Button对象Scale和Position为非默认值会出现异常,Scale影响按压的距离,会造成Press Button的值缩放;Position会造成模拟按压位置偏移。因为在源码的199行将按钮位移的transform转为了本地坐标系。
var localOffset = transform.InverseTransformVector(interactorTransform.position - m_BaseButtonPosition);
  • 解决这一问题有两种方法可以解决。第一,也就是最简单的方法,将两个子对象设为同一层级。第二,如果一定要为嵌套结构,可以通过设置新的层级结构来解决。

屏幕截图 2024-06-23 170619.png 屏幕截图 2024-06-23 170551.png

  • 为按钮新建两个空对象为ButtonPlane和ButtonPush,将这两个对象的Transform进行Reset。再把实际可视ButtonPlaneView和ButtonPushView作为其子对象。调整ButtonPushView的位置修改到实际所需要的位置,但仅仅作为可视化功能。删除ButtonPushView中的Collider和Rigbody,为ButtonPush添加Collider和Rigbody,修改Collider的大小和位置与ButtonPushView重合,让其成为真正用于交互的对象,这样组将的初始化就完成了。

屏幕截图 2024-06-23 170927.png 屏幕截图 2024-06-23 170837.png

  • 在XR Push Button的Button属性上挂载ButtonPush对象。