unityvr开发教程openxr+xrinteractiontoolkitui

YY-nb YY-nb     2023-04-01     557

关键词:

文章目录


往期回顾:
Unity VR开发教程 OpenXR+XR Interaction Toolkit (一) 安装和配置
Unity VR开发教程 OpenXR+XR Interaction Toolkit (二) 手部动画
Unity VR开发教程 OpenXR+XR Interaction Toolkit (三) 转向和移动
Unity VR开发教程 OpenXR+XR Interaction Toolkit (四) 传送

在 VR 的交互中,与 UI 进行交互是很常见的功能。本篇教程,我将介绍如何在 VR 世界中用射线进行 UI 的交互。


📕教程说明

使用的 Unity 版本: 2020.3.36

使用的 VR 头显: Oculus Quest 2

教程使用的 XR Interaction Toolkit 版本:2.1.1(此教程尽量考虑了向上兼容,如果有过期的地方,欢迎大家指出)

前期的配置:环境配置参考教程一,手部模型参考教程二。本篇教程的场景基于上一篇教程搭建的场景进行延申。

项目源码(持续更新):https://github.com/YY-nb/Unity_XRInteractionToolkit_Tutorial2022/tree/master

最终实现的效果:手部射线(一开始是看不见的)对准 UI 时,会显示一条指向 UI 的射线。按下手柄的 Trigger 键,能与可交互的 UI(如 Button,Toggle,Slider 等)进行互动。


📕制作 World Space 模式的 UI

首先在场景中创建一个 Canvas 游戏物体。基于 VR 应用的沉浸感,其中的 UI 应该是 3D 世界中的一部分,因此我们在制作 UI 的时候要把 Canvas 组件的 Render Mode 改为 World Space

然后调整一下 Canvas 的大小和位置,就可以在 Canvas 上添加 UI 了。这里我就加上一个 Button,一个 Toggle 和 一个 Slider:


📕添加 Tracked Device Graphic Raycaster 脚本

在 Canvas 上添加 Tracked Device Graphic Raycaster 脚本。添加了这个脚本后,UI 就能被射线响应。


📕添加 XR UI Input Module 脚本

在 EventSystem 游戏物体上添加 XR UI Input Module 脚本,并且把原先的 Standalone Input Module 脚本移除。XR UI Input Module 配合 Event System 组件,可以让 Input Action 中的动作配置作用于 VR 中的 UI,让 UI 能够被交互,比如让按钮能被射线点击。


📕添加 UI 射线相关脚本

因为在我们的需求中,是用射线与 UI 进行交互,所以我们需要添加和射线相关的脚本。这时候我们可以联想一下我写的上一篇传送教程(Unity VR开发教程 OpenXR+XR Interaction Toolkit 2.1.1 (四) 传送)。因为传送也有用到射线,所以我们完全可以用类似的思路实现 UI 射线,即分别在左右手的控制器上添加发送射线的相关脚本。

我们沿用上一篇传送教程中的 XR Origin (因此保留了传送功能),然后分别在 LeftHand Controller 和 RightHandController 下创建 LeftHand UIController 和 RightHand UIController 游戏物体:

模仿传送功能,添加上 XR Controller(Action-based) (关闭 Enable Input Tracking,并且添加对应的 Preset),XR Ray Interactor(Line Type 为 Straight Line,因为我们希望 UI 的射线是一条直线),Line Renderer(可以复制 TeleportController 上的 Line Renderer 组件),XR Interactor Line Visual 脚本。

左右手都添加了这些组件后,就能够发射一条直的射线。我们可以运行一下程序,这时候会发现两只手都会射出一条直的射线,当射线射到 UI 上时,按下手柄的 Trigger 键能被可交互的 UI (Button,Toggle,Slider)响应,比如能用射线点击按钮,拖动滑动条。


📕过滤 UI 射线的目标

但是仍然存在一个问题,我们的 XR Interactor Line Visual 脚本规定了当 UI 射线被激活时,射线颜色为白色;未被激活时射线颜色为红色。见 XR Interactor Line Visual 的 Valid Color Gradient 和 Invalid Color Gradient:

但是当我们的 UI 射线射在地面上的时候仍然处于激活的状态,还会显示传送功能中射线末端的 Reticle,并且当我们按下手柄的 Grip 键,居然也会触发传送。(见下图,UI 射线射到地面上时颜色为白色,说明处于激活的状态)

这个问题其实和上一篇传送教程中出现的问题是一样的,此时我们拥有两种射线,一种是传送射线,被上一篇教程中我们自己写的 TeleportationController 脚本所控制;另一种是刚刚创建的 UI 射线,它使用的是默认的配置。

因为我们之前给地面添加了 Teleportation Area 脚本,默认情况下是当射线射到地面的碰撞体时,会视为选中了传送区域,然后因为负责 UI 射线的 XR Controller 中的 Select Action 默认绑定的是 XRI LeftHand/RightHand Interaction 下的 Select 动作,而 Select 动作又绑定了 “Grip 键按下” 这个操作,所以按下 Grip 键会响应到传送的功能。而且是本应该负责与 UI 交互的射线响应了传送的触发。

但我们希望的是 UI 射线只有射到 UI 上的时候才能被激活。所以我们要对能激活 UI 射线的目标做个过滤。解决办法也很简单,我们找到 LeftHand UIController 物体和 RightHand UIController 物体上挂载的 XR Ray Interactor 脚本,把 Raycast Mask 中的 Everything 改成 UI

修改前:

修改后:

现在我们再运行一下程序,这时候 UI 射线只有射到 UI 上才会变成白色,而射到地面上显示的是红色,说明只有 UI 激活了 UI 射线。

但是这里还可以有个优化,在当前的程序中,我们会看到手部一直射出一条有颜色的射线,即使没有指向 UI,场景中依然存在一条红色的射线。而我们可以这样改进:让射线射到 UI 上时才能显示,而射到其他地方不显示射线。


📕使射线射到 UI 上时才显示射线颜色

改进方法很简单,找到 XR Interactor Line Visual 脚本,修改 Invalid Color Gradient,我们可以把它的透明度改为 0。这样,当射线射到不是 UI 的地方时,射线就是透明的,在我们的眼中就是不显示的。

点开 Invalid Color Gradient 后,找到左上角和右上角白色的角标,点击后找到 Alpha 值,将它改成 0 就能让射线在未激活状态下处于透明状态。

修改前:

修改后:

现在再次运行程序,这时候只有射线射到 UI 上的时候才会看到白色的射线。


📕改变射线发射的位置

现在我们的射线是从大拇指附近射出来的,但是如果我想改变射线发射的位置呢?

其实操作也很简单,我们在手部模型下创建一个子物体作为射线发射的起始点,我这里将起始点的位置移至食指的地方,相当于让射线从食指处发出,射线发射的方向与起始点本地坐标的 z 轴方向一致

找到 XR Ray Interactor 脚本中的 Ray Origin Transform

然后将刚刚创建的射线起始点分别拖入对应的 XR Ray Interactor 脚本的 Ray Origin Transform

现在试着运行程序,射线就会从食指射出啦!😊

unityvr开发教程openxr+xrinteractiontoolkit手部动画(代码片段)

...Subsystem)📕第四步:调整场景往期回顾:UnityVR开发教程OpenXR+XRInteractionToolkit(一)安装和配置上一篇教程我们成功安装和配置了UnityOpenXR+XRInteractionToolkit开发VR的环境,最终将VR头显和电脑进行串流后,... 查看详情

unityvr开发教程openxr+xrinteractiontoolkit(六)手与物品交互(触摸抓取)(代码片段)

文章目录📕教程说明📕VR交互的类型📕发起交互的对象(Interactor)⭐XRDirectInteractor脚本⭐添加可交互区域📕可交互的对象(Interactable)⭐添加刚体⭐XRSimpleInteractable脚本⭐InteractableEvents⭐XRGrabInter... 查看详情

unity开发openxr|使用openxr制作一款简单vr示例场景的全过程详细教程,包含两个实战案例。

文章目录 查看详情

unity开发openxr|使用openxr添加一个运动系统,实现传送抓取功能的简单vr示例场景的全过程详细教程

文章目录 查看详情

unity开发openxr|使用openxr制作一款简单vr示例场景的全过程详细教程,包含两个实战案例。(代码片段)

文章目录📢前言🎬OpenXR|使用OpenXR制作一个简单VR示例场景的全过程详细教程🏳️‍🌈打开UnityHub新建一个Unity项目🏳️‍🌈添加XRPluginManagment🏳️‍🌈配置安卓版本🏳️‍🌈导入XRInterac... 查看详情

unity开发openxr|openxr是什么?一文带你全面了解openxr的相关知识,上车收藏不迷路

文章目录OpenXROpenXR出现的背景标准化有何好处Khronos百度百科Khronos相关标准OpenXR概念行业行情总结OpenXR“OpenXR”旨在标准化各种VR/AR平台上的设备和应用程序之间的规范。它由KhronosGroup制定,KhronosGroup是一个由VR/AR相关公司组... 查看详情

unityxrunity开发openxr

Unity开发OpenXR介绍OpenXR相关依赖插件OpenXROpenXRPluginXRInteractionToolkitXRPluginManagement安装OpenXR相关依赖插件PackageManagerUnityVR模板配置OpenXR相关依赖插件安装PicoXRSDK下载PICOUnityIntegrationSDKPackageManager导入SDK介绍OpenXR相关依赖插件OpenXROpenXR... 查看详情

unity开发openxr|使用openxr制作一款《保龄球demo》加深对controller控制器的理解使用

查看详情

unity使用openxr和xrinteractiontoolkit开发htcvive(vivecosmos)(代码片段)

Unity使用OpenXR和XRInteractionToolkit开发HTCVive(ViveCosmos)提示:作者是Unity2020.3以上版本做的开发。开发VR程序需要安装Steam,SteamVR,(ViveCosmos,需要再安装VIVEPORT,VIVEConsole)OpenXR控制设备(头盔,手柄)通信。XR... 查看详情

unityvr视频/图片开发心得

  上回说到了普通的全景图片,这回讲真正的VR。  由于这种图片分为两部分,所以我们需要两个Camera对象以及两个球体。首先新建一个Camera对象,并将其命名为RightEye(其它名字也无妨,只要你自己清楚就行了),将本来... 查看详情

unityvr视频/图片开发心得

  现在的VR似乎没有之前那么火热了,于是乎我居然开始了VR征程。。。  说起VR,对于没有接受过相关知识的人来说可能看起来比较高大上,但是VR的原理却没有想象中那么复杂。总的来说,VR之所以能够产生立体感,是因... 查看详情

unityvr关于oculus如何连接unity编译器,无需打包就可以看到场景的教程(代码片段)

前言几天的碰壁,没有白费,可以说光是做一个能让让Oculus跑起来的demo这个过程中,几乎是一个坑连着一个坑,国内教程不完善,google也有少量的坑。。。下面就开始吧,我尽量每一步都说详细点!切... 查看详情

unityvr开发结合vrtk4.0:将浮点数从交互器传递到可交互对象(代码片段)

语录:   愿你熬得过万丈孤独,藏得下星辰大海。前言:    默认情况下,交互器只能将单个布尔操作传递给可交互对象,后者控制可交互对象上的抓取操作。在其他时候,交互器中的其他操作可能希... 查看详情

unityvr开发结合vrtk4.0:将浮点操作转换为布尔操作

语录:奈何桥上奈何愁,奈何桥下浣溪流,奈何人人奈何泪,奈何奈何洗春秋。前言:   有时,您可能希望使用一个值来激活或停用操作类型。例如,按下控制器上的扳机轴会导致在完全按下扳机时... 查看详情

vr/ar标准委员会成立,宣布全新的标准openxr

Khronos集团在今天早些时候宣布了开放VR/AR标准委员会——OpenXR工作组。这一组织也将会由世界领头羊VR/AR公司的代表组成。而宣布的公司中包括:Facebook子公司Oculus、valve、unity、Epic、三星和谷歌,但是并不包含HTC的子公司Vive。Vi... 查看详情

unityvr一体机报错:gl_out_of_memory,[egl]unabletoacquirecontext

开发和部署环境Unity:2020.3.40PicoG24k一、报错信息一览(1)[EGL]Unabletoacquirecontext:EUnity:[EGL]Unabletoacquirecontext:EGL_BAD_SURFACE:AnEGLSurfaceargumentdoesnotnameavalidsurface(window,pixelbufferorpixmap)configuredforGLrendering.解决办法:多线程渲... 查看详情

unityvr&arunity播放全景视频及优化极点变形twist问题(代码片段)

2016年是VR元年,这一年度多少少做了点东西,都是关于VR&AR的,虽然现在是冷冬期,个人认为前景还是有的,只不过会曲折前进,工业革命还分好几次呢,对吧!好了,最近比较空闲,会... 查看详情

关于在unityvr中,可以让电脑显示屏幕显示另一个视角的画面,而步影响到vr里面的视角操作vrasymmetrical

第一步是新建一个场景然后不要删除场景中的maincamera,把这个摄像机当成运行后,另一个视角然后将steamvrplugin导入,将里面prefab文件中的cameraRig拖到场景中,然后建一个脚本,在start里面就执行一行代码UnityEngine.VR.VRSettings.ShowDe... 查看详情