通过手柄发射射线与UI按钮进行交互

在Button上需要添加的两个脚本和组件

手柄需要准备的内容

在手柄控制器上添加脚本SteamVR_LaserPointer,使得手柄可以发射射线,在创建脚本LaserInteraction实现UI交互功能

//为射线移入移出或点击Button时的三个事件添加监听事件,即UGUI中Button的移入、移出、点击事件
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using Valve.VR.Extras;public class LaserInteraction : MonoBehaviour
{// LaserPointer组件private SteamVR_LaserPointer _laser;// 当前交互的UI元素private GameObject _uGUIElement;// 是否开启激光指针交互public bool isEnabled = true;private void Awake(){// 获取到LaserPointer组件_laser = GetComponent<SteamVR_LaserPointer>();// 如果不为空if (_laser != null){// 如果不开启激光指针交互if (!isEnabled){// 激光指针不显示_laser.enabled = false;return;}else // 如果开启激光指针交互{_laser.PointerIn += LaserOnPointerIn;_laser.PointerOut += LaserOnPointerOut;_laser.PointerClick += LaserOnPointerClick;}}}private void LaserOnPointerIn(object sender, PointerEventArgs e){IPointerEnterHandler _pointerEnterHandler = e.target.gameObject.GetComponent<IPointerEnterHandler>();if (_pointerEnterHandler != null){_pointerEnterHandler.OnPointerEnter(new PointerEventData(EventSystem.current));}}private void LaserOnPointerOut(object sender, PointerEventArgs e){IPointerExitHandler _pointerExitHandler = e.target.gameObject.GetComponent<IPointerExitHandler>();if (_pointerExitHandler != null){_pointerExitHandler.OnPointerExit(new PointerEventData(EventSystem.current));}}private void LaserOnPointerClick(object sender, PointerEventArgs e){IPointerClickHandler _pointerClickHandler = e.target.gameObject.GetComponent<IPointerClickHandler>();if (_pointerClickHandler != null){_pointerClickHandler.OnPointerClick(new PointerEventData(EventSystem.current));}}}

另一种更简单的方式

首先手柄只需要挂上射线脚本Steam VR_Laser Pointer

然后对于UI元素,我们只需要在其上挂上碰撞器BoxCollider即可

最后也是最核心的就是我们需要为手柄射线移入移出点击 添加事件(上诉一样添加的是UGUI的按钮点击事件,这里是我们自身需要的逻辑函数)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Valve.VR.Extras;
public class UIManager : MonoBehaviour
{//将挂载了Steam VR_Laser Pointer的物体赋值给Hand,若两只手都需要请多定义一个并赋值和添加监听[SerializeField] public GameObject Hand; private void Start(){//为Hand的射线移入移出点击 绑定需要的函数Hand.GetComponent<SteamVR_LaserPointer>().PointerIn += SceneOneUI_PointerIn;Hand.GetComponent<SteamVR_LaserPointer>().PointerOut += SceneOneUI_PointerOut;Hand.GetComponent<SteamVR_LaserPointer>().PointerClick += SceneOneUI_PointerClick;}private void SceneOneUI_PointerClick(object sender, PointerEventArgs e){if (e.target.name == "Btn1"){Debug.log("挂载了碰撞体并且命为  Btn1 的物体被点击了");}//....扩展,若有其他UI元素需要交互,请为它添加BoxCollider组件,并命名//例如下/* if (e.target.name == "Btn2"){Debug.log("挂载了碰撞体并且命为  Btn1 的物体被点击了");}*/}private void SceneOneUI_PointerOut(object sender, PointerEventArgs e){if (e.target.name == "Btn1"){Debug.log("射线移出 挂载了碰撞体并且命为  Btn1 的物体");}}private void SceneOneUI_PointerIn(object sender, PointerEventArgs e){if (e.target.name == "Btn1"){Debug.log("射线移入 挂载了碰撞体并且命为  Btn1 的物体");}}IEnumerator Btn1OnClick(){//点击后的游戏逻辑}
}

如果我们还有其他UI 也可以在UIManager中扩展,只需要区别碰撞体不同的名字即可,当UI元素比较少时可以这么做,简单方便。

SteamVR使用射线与UI进行交互相关推荐

  1. PicoXR中手柄射线与UI的交互

    PicoXR中手柄射线与UI的交互 本文将介绍在PicoXR中如何使用手柄射线与UI进行交互 基本步骤 开发Unity XR项目必不可少的要先右键点击Hierarchy面板 XR-Room-Scale ...

  2. 为SteamVR做射线触发UI

    最近需要在SteamVR上做类似VRTK的射线和UI交互的功能.我自己开发的时候的思路是在右手手柄上加一个LineRender组件,然后从手柄的位置为起点,手柄正方向transform.forward ...

  3. SteamVR使用射线交互UI

    由于Unity软件对VR插件的兼容性问题使得实际项目中对于VR插件的使用限制很大,官方对于SteamVR插件的兼容性是最稳定的,SteamVR插件的示例场景里面对于UI的交互是使用的手柄触摸的方式,在 ...

  4. SteamVR使用Curved UI实现与UI的交互

    在SteamVR中对于UI的交互只能实现简单的点击,对于滑动条拖拽之类的交互则需要使用外部插件.Curved UI插件具有面向多VR平台的SDK集成. 1.在Canvas组件添加CurvedUISet ...

  5. unity 开发HTC vive UI的交互

    在HTC的VRTK插件里UI的交互最常见的就是依靠手柄发出一条射线然后和界面进行交互. 在VRTK里发出射线的脚本有两个VRTK_SimplePointer脚本和VRTK_BezierPointer脚 ...

  6. C#后台线程和UI的交互

    http://www.cnblogs.com/Wizardh/articles/963097.html 在C#中,从Main()方法开始一个默认的线程,一般称之为主线程,如果在这个进行一些非常耗CPU ...

  7. Android中后台线程如何与UI线程交互

    我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须 ...

  8. 移动端超高品质的Axure UI设计/交互设计组件库,几乎涵盖了所有的组件

    这套超高品质的Axure UI设计/交互设计组件库,无论是APP原型设计还是小程序设计,都能满足您日常设计所需,关键是能让交互设计稿美美哒,简直是提高工作效率必备文档库,实属移动端设计组件中的顶级资源 ...

  9. 广州优漫动游公司:高级UI/UE交互设计就业班学什么?

    广州ui设计培训学校,UI交互设计培训,ui界面设计培训,UI培训学校,ui界面交互设计培训,UI培训哪个学校好–高级UI交互设计就业班.UI设计培训,高级UI/UE交互设计就业班. 一.培训特色 项 ...

最新文章

  1. mysql执行底层_天天写order by,你知道Mysql底层如何执行吗?
  2. Kafka 入门和 Spring Boot 集成
  3. 05 Python字符串的通用操作
  4. 容器编排技术 -- Kubernetes Service
  5. Java练习02 打印三角形
  6. CSU 1115: 最短的名字(字典树)
  7. awk取文本列_Linux:使用awk命令获取文本的某一行,某一列;sed插入指定的内容到指定文件中...
  8. https://www.icourse163.org/learn/PKU-1002534001?tid=1003136008#/learn/quiz?id=1003986014
  9. python勒索病毒代码_.Lucky后缀勒索病毒数据解密(示例代码)
  10. 基于Golang 的后台管理系统框架
  11. 第一次滑雪小记——杭州临安大明山滑雪场
  12. 网站打开速度测试常用的两种工具及操作方法
  13. 无器械健身,是否真的比健身房器械训练要好?
  14. 查看windows服务器型号,windows 查看服务器型号
  15. python聚合函数_Python 数据聚合 - 树懒学堂
  16. 【刷题日记】网易——牛牛的背包问题
  17. [学习笔记] CDQ分治 从感性理解到彻底晕菜
  18. 记一则SQL 数据库状态(可疑)(紧急)解决方案
  19. 爬虫实战——豆瓣电影Top250
  20. 遭遇PSW Win32 WoWar Trojan Win32 MnLess Trojan IMMSG Win32 TBM

热门文章

  1. FDX-B|EMID格式低频RFID 读卡模块LD6900技术选型与说明
  2. OpenGL - Draw Triangle
  3. IT员工眼中的加班猝死:无加班不IT
  4. 区块链之 Merkle Tree理解
  5. python中的元祖
  6. 快过年了,自娱自乐,写个打油诗给自己加油!
  7. 如何解决caffe和video-caffe不能使用cudnn8编译的问题
  8. caffe(cpu)配置之终极成功版哈哈哈
  9. 2023年华中师范大学政治学专业考研参考书、难度及各科备考经验
  10. 采坑所悟20181122早