VRTK功能教学(二):Unity3DVRTK手柄瞬移和UI交互射线切换功能丨3D模型射线交互切换丨直线和曲线的切换

`

文章目录

  • VRTK功能教学(二):Unity3DVRTK手柄瞬移和UI交互射线切换功能丨3D模型射线交互切换丨直线和曲线的切换
  • 介绍
  • 代码展示
  • 配置方法
    • 基础配置
    • UI交互配置
    • 3D物体模型交互
  • 总结

介绍

本文:针对VRTK的手柄交互功能,瞬移和UI交互的时候两个射线无法有效切换的问题


代码展示

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using VRTK;public class VRTK_SwitchPointLine : MonoBehaviour
{public VRTK_BezierPointerRenderer bezierRender;public VRTK_StraightPointerRenderer straightRender;public VRTK_Pointer mainPointer;public string InteractHoverTag = "ModeObj";private VRTK_ControllerEvents mEvent;private VRTK_ShotLine cacheShowLabel;public UnityAction<string> r_RayAction = null;// public UnityEvent TipAccordingObjevent;private void Awake(){mEvent = GetComponent<VRTK_ControllerEvents>();mainPointer.activateOnEnable = false;bezierRender.enabled = false;straightRender.enabled = false;}void Update(){Ray ray = new Ray(transform.position, transform.forward);if (Physics.Raycast(ray, out var hit)){VRTK_ShotLine temp = hit.transform.GetComponent<VRTK_ShotLine>();//直线射线物体使用方式为轻触触摸板 对准带着规定标签的物体 射线转换为直线if (temp != null && mEvent.touchpadTouched){if (hit.transform.tag.Equals(this.InteractHoverTag) || hit.transform.tag.Equals("PositionControl")){temp.LineEnter(this.mEvent);if (mEvent.triggerClicked){Debug.Log(hit.collider.name);r_RayAction?.Invoke(hit.collider.name);}}if (cacheShowLabel == null){temp.LineEnter();}elseif (cacheShowLabel != null && cacheShowLabel != temp){cacheShowLabel.LineExit();temp.LineEnter();}cacheShowLabel = temp;mainPointer.pointerRenderer = straightRender;}else{//否则射线为曲线if (cacheShowLabel != null){cacheShowLabel.LineExit();cacheShowLabel = null;}//判断检测到Ui的交互时射线转换为直线if (hit.transform.GetComponent<VRTK_UICanvas>()){mainPointer.pointerRenderer = straightRender;}else if (hit.transform.tag == "canPoint"){mainPointer.pointerRenderer = straightRender;}else{mainPointer.pointerRenderer = bezierRender;}}}else{if (cacheShowLabel != null){cacheShowLabel.LineExit();cacheShowLabel = null;}mainPointer.pointerRenderer = bezierRender;}if (mEvent != null && cacheShowLabel != null){if (mEvent.triggerClicked){cacheShowLabel.Execute();cacheShowLabel = null;}}if (mainPointer.pointerRenderer == straightRender){bezierRender.enabled = false;straightRender.enabled = true;mainPointer.activateOnEnable = true;mainPointer.holdButtonToActivate = false;mainPointer.activationButton = VRTK_ControllerEvents.ButtonAlias.Undefined;mainPointer.selectionButton = VRTK_ControllerEvents.ButtonAlias.Undefined;straightRender.cursorVisibility = VRTK_BasePointerRenderer.VisibilityStates.AlwaysOn;straightRender.tracerVisibility = VRTK_BasePointerRenderer.VisibilityStates.AlwaysOn;}else{bezierRender.enabled = true;straightRender.enabled = false;mainPointer.activateOnEnable = false;mainPointer.holdButtonToActivate = true;mainPointer.activationButton = VRTK_ControllerEvents.ButtonAlias.TouchpadPress;mainPointer.selectionButton = VRTK_ControllerEvents.ButtonAlias.TouchpadPress;straightRender.cursorVisibility = VRTK_BasePointerRenderer.VisibilityStates.OnWhenActive;straightRender.tracerVisibility = VRTK_BasePointerRenderer.VisibilityStates.OnWhenActive;}}
}

还有这一个脚本,这个脚本本来是为了模型交互使用的,但是如果不加此脚本会报错很多,一个个删除挺麻烦的,如果不需要模型交互把此脚本创建出来不用管就好了

using VRTK;
public interface VRTK_ShotLine
{void LineEnter();void LineExit();void Execute();void LineEnter(VRTK_ControllerEvents events);
}

配置方法

基础配置

首先我们手柄的控制器上挂载的组件不能少

其中的Switch Point Line为我们编译的脚本
三个直接挂载手柄控制器就可以

UI交互配置

UI交互的话除了要配置基础配置还要在想要交互的Canvas上挂载脚本UICanvas

3D物体模型交互

模型交互除了要配置基础配置以外还需要把我们的VRTK_ShotLine脚本挂载在需要交互的物体身上,还有标签,就是我们脚本中定义的名称ModeObj。新手注意:一定要添加碰撞体。

总结

例如:以上就是今天要讲的内容,本文介绍了VRTk的手柄射线功能使用。

VRTK功能教学(二):Unity3DVRTK手柄瞬移和UI交互射线切换功能丨3D模型射线交互切换丨直线和曲线的切换相关推荐

  1. 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

    前言:本文为手把手教学飞控核心知识点之一的姿态解算--MPU6050 姿态解算(飞控专栏第2篇).项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与 ...

  2. 活动直播做多会场切换功能(会场一、会场二、会场三自由切换)

    活动直播做多会场切换功能(会场一.会场二.会场三自由切换) TONY原创,2020-10-29 活动直播做多会场切换功能截图 特点:支持PC端,也支持移动端观看,会场自由切换 我的视频应用类原创文章: ...

  3. Unity XR Interaction Toolkit(二)手柄交互

    目录 一.结构配置 二.交互事件 1.事件设置 2.绑定设置 3.组合按键输入 4.事件挂载 三.代码响应 1.事件回调 2.数值获取 注意,本文的Toolkit版本在2.2以上,低版本没有样例和部分 ...

  4. 大泥王怎么调时区_卡西欧大泥王怎么调时间 卡西欧大泥王功能教学

    卡西欧大泥王相信很多人都十分熟悉的,这个系列的手表在卡西欧家一直挺火,十分适合户外佩戴,那么卡西欧大泥王手表怎么调时间呢? 卡西欧大泥王怎么调时间 1.首先点击左上边的按键进入设置功能. 2.然后按一 ...

  5. 如何在App中实现朋友圈功能之二快速实现用户信息的自定义——箭扣科技Arrownock...

    如何在App中实现朋友圈功能 之二 快速实现用户信息的自定义 自我关联社交元素: anSocial中很多的社交元素API,如帖子(Post).相册(Album).文件(File)等,这些API的可选参 ...

  6. 尼康d850相机参数测试软件,新功能介绍二:景深合成与自动调焦_尼康 D850_数码影像评测-中关村在线...

    ·新功能介绍二:景深合成与自动调焦 对于D850来说,机身也加入了非常多的新功能,这里还逐一介绍一下.首先我们要说的机身的景深合成功能.什么是景深合成?相信很多朋友都了解,相机在很多环境下,景深太浅是 ...

  7. 【GD32F427开发板试用】二、USB库移植与双USB CDC-ACM功能开发

    本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:chenjie [GD32F427开发板试用]一.环境搭建与freertos移植 [GD ...

  8. Android实现录屏直播(二)需求才是硬道理之产品功能调研

    请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54254244 Android实现录 ...

  9. 【微信公众号】微信集成功能--扫描二维码完成用户登录操作

    目录 需求来源 实现思路 1.进入登录页面,生成微信公众号的临时二维码: 2.用户通过微信扫一扫二维码: 3.登录页面定时查询扫码结果: 代码实现(基于Laravel框架前后端混合) HTML PHP ...

最新文章

  1. fiash星空动画制作_三维动画制作的详细流程
  2. 如何编辑Subversion中已提交的日志消息?
  3. android studio 快速删除无用的import包
  4. @slf4j注解_SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验
  5. 尤大直播分享:vue3生态进展和展望
  6. mysql 子查询 as_mysql子查询
  7. 查询每个用户最后一次登录信息
  8. 线性表:顺序栈算法实现
  9. Nginx 的常用命令
  10. 从捡破烂到亿万富翁,这个快递人的故事比电视剧还励志
  11. 浙江高级职称英语 计算机考试时间2016,浙江省2016年度全国专业技术人员职称外语等级统一考试时间...
  12. 【论文阅读】Computational Personality: A Survey 计算性格学综述
  13. plpgsql 编译执行
  14. 10分钟看懂财务报表分析,只需掌握一个公式!
  15. 内存单元地址求字节大小的计算方法
  16. 品牌建设—长效且动态的关系管理进程:赫联电子亚太区
  17. python关于二手房的课程论文_python爬取链家二手房信息
  18. ZY Player 2.8.3 中文版 (全网视频播放器)
  19. Win11玩不了红警怎么办?Win11玩不了红警解决方法分享
  20. r语言 求几个数的最小公倍数_一课研究之“最小公倍数教学后学生知识技能情况分析”(20190417)...

热门文章

  1. 电商全渠道秩序维护 八爪鱼大数据来帮忙
  2. Quaternion.Euler调整记录
  3. 工业互联网-工业企业大数据交换通道-数据通道产品描述
  4. 单片机与计算机串行通信原理图,PC与51单片机之间RS232串行通信电路原理图/源码等...
  5. 小蚁摄像机刷固件开放rtsp等其他功能并接入HomeAssistant
  6. linux下如何使用sftp命令
  7. 笔记本电脑网络重置后,无线网和有线网都连接不上了,而且图标还消失了,在设备管理器里面还显示网卡感叹号。
  8. 异常检测的N种方法,这次全都盘出来了
  9. 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读
  10. Dependency‘org.framework:spring-webmvc:’ not found