SteamVR 2.x UGUI-凝视交互(8)

2024-02-23 04:50
文章标签 交互 ugui steamvr 凝视

本文主要是介绍SteamVR 2.x UGUI-凝视交互(8),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

除了手部触碰以及射线交互UI以外,还有一个目前很多VR一体机使用的凝视交互,这种方式不需要使用手柄去和UI交互,直接使用凝视,几秒钟自动触发事件,不过这种方式,目前只支持Button,其他UI控件不支持,做项目UI交互的话,还是使用前两种UI交互方式。

一、前期准备

新建场景,删除默认相机,将Player拖拽进入场景内
在这里插入图片描述
新建Plane,修改为Floor,上一个黑色材质球,Transform信息如下:
在这里插入图片描述

二、添加UI及组件

结构如下,添加画布、按钮
在这里插入图片描述
在这里插入图片描述
1、Canvas/画布信息
Render Mode要设置为World Space/世界模式
在这里插入图片描述
2、Button信息
在这里插入图片描述

三、制作凝视组件

将图片下载并保存至项目中
在这里插入图片描述
组件结构如下:
在这里插入图片描述
1、画布信息:
在这里插入图片描述
2、Cursor信息
我们可以手动改变Iamge的透明度和颜色
在这里插入图片描述
3、Process信息
进度我们可以改为黄色,Image Type改为Filled填充类型
在这里插入图片描述

四、编写脚本并挂载

using UnityEngine;
using UnityEngine.UI;
using Valve.VR.InteractionSystem;public class SteamVR_HeadGaze : MonoBehaviour
{private Transform headCamera;                                       //头部相机private Transform cursor;                                           //射线光标private Image progress;                                             //凝视进度private LayerMask layerMask;                                        //凝视交互层private float stareTimer;                                           //凝视时间private Vector3 rayPositionOffset = new Vector3(0, 0.005f, 0);      //射线偏移量private float rayLength = 50f;                                      //射线长度private GameObject currentInteractable;                             //当前交互对象private GameObject previousInteractable;                            //上一个交互对象[Header("凝视激活时间")]public float activateTime = 3;private void Awake(){layerMask= 1 << LayerMask.NameToLayer("UI");headCamera = Camera.main.transform;cursor = transform.GetChild(0).transform;progress = cursor.GetChild(0).GetComponent<Image>();}private void Update(){if (headCamera == null) return;if (progress != null) { progress.fillAmount = 0; }EyeRaycast();}/// <summary>/// 眼部射线/// </summary>private void EyeRaycast(){Vector3 adjustedPosition = headCamera.position + (headCamera.right * rayPositionOffset.x) +(headCamera.up * rayPositionOffset.y) +(headCamera.forward * rayPositionOffset.z);Ray ray = new Ray(adjustedPosition, headCamera.forward);RaycastHit hit;if (Physics.Raycast(ray, out hit, rayLength, layerMask)){if (cursor != null){cursor.gameObject.SetActive(true);cursor.position = hit.point;cursor.rotation = headCamera.rotation;}Button aButton = hit.transform.GetComponent<Button>();if (aButton == null){ResetInteractable();currentInteractable = null;return;}currentInteractable = aButton.gameObject;if (currentInteractable && currentInteractable != previousInteractable){InputModule.instance.HoverBegin(currentInteractable);}else if (currentInteractable == previousInteractable){stareTimer += Time.deltaTime;if (progress != null){progress.fillAmount = (stareTimer / activateTime);}if (stareTimer > activateTime){InputModule.instance.Submit(currentInteractable);stareTimer = 0;ResetInteractable();}}if (currentInteractable != previousInteractable) { ResetInteractable(); }previousInteractable = currentInteractable;}else {ResetInteractable();currentInteractable = null;}}/// <summary>/// 重置交互/// </summary>private void ResetInteractable(){stareTimer = 0;if (progress != null) { progress.fillAmount = 0; }if (previousInteractable == null) { return; }InputModule.instance.HoverEnd(previousInteractable);previousInteractable = null;if (cursor != null){cursor.gameObject.SetActive(false);}}
}

脚本就100来行,直接挂载到HeadGazeUI组件上,什么参数都不需要进行设置。
至此,只要Button上挂载了碰撞器,运行游戏后,头盔视野看向Button,会看到有一个黄色的圆圈在自动填充,3s后自动触发按钮

这篇关于SteamVR 2.x UGUI-凝视交互(8)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737572

相关文章

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程

序言 当一个新的 Pod 被提交创建之后,Kubelet、CRI、CNI 这三个组件之间进行了哪些交互? Kubelet -> CRI -> CNI 如上图所示: Kubelet 从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。Kubelet 创建 sandbox 并配置好 Pod 的环境,其中包括: Kubelet 通过 gRPC 调用 C

【SpringMVC学习07】SpringMVC与前台的json数据交互

json数据格式在接口调用中、html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍。在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springmvc中如何和前台交互json数据。 1. 两种交互形式  springmvc和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种

【Qt】Qt与Html网页进行数据交互

前言:此项目使用达梦数据库,以Qt制作服务器,Html制作网页客户端界面,可以通过任意浏览器访问。 1、Qt与网页进行数据交互 1.1、第一步:准备qwebchannel.js文件 直接在qt的安装路径里复制即可 1.2、第二步:在Qt的.pro文件加载webchannel组件 在.pro文件添加如下组件: QT += core gui sql webchannel wi

UIFrameWork-基于UGUI-如何比较设计优劣

一、简化需求 1、从界面1打开界面2,屏蔽界面1事件响应。 2、关闭界面2,恢复界面1的事件响应。 二、暴力方案 1、对象1设置屏蔽自身事件响应,对象1通知对象2显示。 2、对象1设置恢复自身事件响应,对象2通知对象1显示。 三、UIFrameWork方案 1、对象1通知管理器对象要打开的界面信息(字符串),管理器对象通知对象1屏蔽事件响应,管理器通知对象2显示。 2、对象2通知管

UGUI 背景自适应文本框

需求 UGUI背景自适应文本框UGUI背景图片随文本框长度变化 解决方案 仅文本框宽度自适应 背景节点配置: 背景节点下的Text子节点配置: 文本框宽高自适应 将Vertical Fit设置为Preferred Size 将Child Controls Size Height选项勾上

android 的webView加载h5,和h5的交互(java和JavaScript的交互)

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。(通俗点说就是,点击那个Web页面的按钮啥的,可以传到原生app;或者原生app调用Web页面的js方法) 如何实现 实现Java和js交互十分便捷。通常只需要以下几步。 WebView

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。批量字符串(Bulk St

Result 和 自定义异常 在前后端交互中的作用

Result 和自定义异常在前后端交互中扮演着重要的角色。它们可以帮助我们规范化接口返回值,提高错误处理的可读性和可维护性。 Result的作用 Result通常是一个封装了请求结果的类,它包含了请求的状态码、消息和数据。在前端和后端的交互中,Result的作用主要体现在以下几个方面: 统一返回格式:通过Result类,后端可以将请求的结果统一封装成一个固定的格式返回给前端,这样前端可以更

使用Node-API实现跨语言交互开发流程

一、前言         使用Node-API实现跨语言交互,首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧:实现C++方法的调用。代码比较简单,import一个对应的so库后,即可调用C++方法。 Native侧:.cpp文件,实现模块的注册。需要提供注册lib库的名称,并在注册回调方法中定义接口的映射关系,即Native方法及对应的JS/ArkT