【Steam VR 2.0】5.射线操作UGUI-射线点击物体

2024-06-14 06:58

本文主要是介绍【Steam VR 2.0】5.射线操作UGUI-射线点击物体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于目前SteamVR的射线SteamVR_LaserPointer没有操作UGUI的功能,所以这里就不再对SteamVR_LaserPointer进行过多介绍,功能的实现借助插件【InputUtility】来实现,这个插件AssetStore可以免费获取。

插件的导入,有时会因为未编译SteamVR_Input而导致插件的按键无法使用,这里需要注意的是,导入steamVR选择openVR时,要选择较新的UnityVR,之后导入插件便会自动弹出Wizard窗口,AcceptAll即可。

1.操作UGUI

正确导入SteamVR2.0+和Input Utility后,可以在Input Utility的示例场景中,查看UGUI的操作案例

HTC.UnityPlugin - ViveInputUtility - Examples - 1.UGUI

将SteamVR里的Player与插件结合使用

结合Player的传送和插件的射线功能,Player传送功能的使用方法可以参考前面文章。

为Player添加操作射线的UI

1.将Player做成新预设,这里命名为PlayerUI,然后将新预设的Player UnpackPrefab

2.找到HTC.UnityPlugin - ViveInputUtility - Prefabs中的预设VivePointers,将其拖拽到PlayerUI中

SteamVRObject子物体下。保持位置和旋转为0

3.新建一个Canvas,选择word模式,摆放到面前,添加一个Button按钮,

为Canvas添加脚本CanvasRaycastTarget

运行,即可使用射线指向按钮,点击Trigger触发按钮,其他UGUI同理

兼容操作UI的射线与传送的射线

由于,player的传送与VivePointer的射线分属不同插件,我们需要在需要的时候,手动开启相关功能。否则会出现如下射线重叠的情况

传送指示的UI是在按住Pad时显示,松开时隐藏,那么我们只需要将操作UI的射线反向操作一下即可

这里我创建了一个脚本挂在预设PlayerUI的VivepPointer上,来方便获取

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GetVivePointerUtility : MonoBehaviour
{public static GetVivePointerUtility instance;private void Awake() {instance = this;}
}

然后创建脚本PlayerUtility挂在PlayerUI上

 PlayerUtility.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;public class PlayerUtility : MonoBehaviour
{public SteamVR_Action_Boolean teleportAction = SteamVR_Input.GetAction<SteamVR_Action_Boolean>("Teleport");private GameObject _vivePointer;//操作UI,射线物体private GameObject vivePointer {get {if (_vivePointer == null) {_vivePointer = GetVivePointerUtility.instance.gameObject;}return _vivePointer;}}private void Update() {if (teleportAction.GetStateDown(SteamVR_Input_Sources.Any)) {vivePointer.SetActive(false);}if (teleportAction.GetStateUp(SteamVR_Input_Sources.Any)) {vivePointer.SetActive(true);}}
}

至此即可完成一个带有传送及操作UGUI的基础环境

注:若需要将操作UI的射线,不一直显示,可以使用Menu键,点按,开启或关闭

2.借助VivePointer实现点击物体

VivePointer的射线可以在物体上监听射线Enter,Exit,Click等事件,还可以为Click绑定不同的按键,并且借助

eventData.pointerCurrentRaycast.worldPosition

可以获取到,射线点击到的点(世界坐标V3或者平面坐标V2)

1.直接获取手柄某按键点击(类似旧版SteamVR的按键获取方式)

用这种方式可以方便获取按键,并快捷绑定事件,缺点就是失去了部分SteamVR 2.0 input system的跨硬件优势,如果没有跨硬件需求,这种模式还是比较好用的。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HTC.UnityPlugin.Vive;public class TestA001 : MonoBehaviour
{private void Update() {if (ViveInput.GetPressDownEx(HandRole.RightHand, ControllerButton.Trigger)) {Debug.Log("Right Trigger");}if (ViveInput.GetPressDownEx(HandRole.LeftHand, ControllerButton.Trigger)) {Debug.Log("left Trigger");}}
}

2.射线与物体的交互

注意,命名空间的引用,这里使用了EventSystem的接口,所以场景中也需要有EventSystem(若使用了Player,则不需要手动添加EventSystem,因为player的InputModule上已经带有了EventSystem)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HTC.UnityPlugin.Vive;
using UnityEngine.EventSystems;public class TestB001 : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler {public void OnPointerClick(PointerEventData eventData) {if (eventData.IsViveButton(ControllerButton.Trigger)) {//获取按键点击,并且获取点击到的Raycast pointDebug.Log("Trigger Click point =" + eventData.pointerCurrentRaycast.worldPosition);}else if (eventData.button == PointerEventData.InputButton.Left) {Debug.Log("Standard button triggered");}}public void OnPointerEnter(PointerEventData eventData) {Debug.Log("Enter");}public void OnPointerExit(PointerEventData eventData) {Debug.Log("Exit");}
}

将脚本,挂载到一个cube上即可

这篇关于【Steam VR 2.0】5.射线操作UGUI-射线点击物体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

Python操作Excel的实用工具与库openpyxl/pandas的详细指南

《Python操作Excel的实用工具与库openpyxl/pandas的详细指南》在日常数据处理工作中,Excel是最常见的数据文件格式之一,本文将带你了解openpyxl和pandas的核心用法,... 目录一、openpyxl:原生 Excel 文件操作库1. 安装 openpyxl2. 创建 Exc

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士