VRTK功能教学(二):Unity3DVRTK手柄瞬移和UI交互射线切换功能丨3D模型射线交互切换丨直线和曲线的切换
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模型射线交互切换丨直线和曲线的切换相关推荐
- 基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)
前言:本文为手把手教学飞控核心知识点之一的姿态解算--MPU6050 姿态解算(飞控专栏第2篇).项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算(四元数方法),搭配设计的卡尔曼滤波器与 ...
- 活动直播做多会场切换功能(会场一、会场二、会场三自由切换)
活动直播做多会场切换功能(会场一.会场二.会场三自由切换) TONY原创,2020-10-29 活动直播做多会场切换功能截图 特点:支持PC端,也支持移动端观看,会场自由切换 我的视频应用类原创文章: ...
- Unity XR Interaction Toolkit(二)手柄交互
目录 一.结构配置 二.交互事件 1.事件设置 2.绑定设置 3.组合按键输入 4.事件挂载 三.代码响应 1.事件回调 2.数值获取 注意,本文的Toolkit版本在2.2以上,低版本没有样例和部分 ...
- 大泥王怎么调时区_卡西欧大泥王怎么调时间 卡西欧大泥王功能教学
卡西欧大泥王相信很多人都十分熟悉的,这个系列的手表在卡西欧家一直挺火,十分适合户外佩戴,那么卡西欧大泥王手表怎么调时间呢? 卡西欧大泥王怎么调时间 1.首先点击左上边的按键进入设置功能. 2.然后按一 ...
- 如何在App中实现朋友圈功能之二快速实现用户信息的自定义——箭扣科技Arrownock...
如何在App中实现朋友圈功能 之二 快速实现用户信息的自定义 自我关联社交元素: anSocial中很多的社交元素API,如帖子(Post).相册(Album).文件(File)等,这些API的可选参 ...
- 尼康d850相机参数测试软件,新功能介绍二:景深合成与自动调焦_尼康 D850_数码影像评测-中关村在线...
·新功能介绍二:景深合成与自动调焦 对于D850来说,机身也加入了非常多的新功能,这里还逐一介绍一下.首先我们要说的机身的景深合成功能.什么是景深合成?相信很多朋友都了解,相机在很多环境下,景深太浅是 ...
- 【GD32F427开发板试用】二、USB库移植与双USB CDC-ACM功能开发
本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:chenjie [GD32F427开发板试用]一.环境搭建与freertos移植 [GD ...
- Android实现录屏直播(二)需求才是硬道理之产品功能调研
请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54254244 Android实现录 ...
- 【微信公众号】微信集成功能--扫描二维码完成用户登录操作
目录 需求来源 实现思路 1.进入登录页面,生成微信公众号的临时二维码: 2.用户通过微信扫一扫二维码: 3.登录页面定时查询扫码结果: 代码实现(基于Laravel框架前后端混合) HTML PHP ...
最新文章
- fiash星空动画制作_三维动画制作的详细流程
- 如何编辑Subversion中已提交的日志消息?
- android studio 快速删除无用的import包
- @slf4j注解_SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验
- 尤大直播分享:vue3生态进展和展望
- mysql 子查询 as_mysql子查询
- 查询每个用户最后一次登录信息
- 线性表:顺序栈算法实现
- Nginx 的常用命令
- 从捡破烂到亿万富翁,这个快递人的故事比电视剧还励志
- 浙江高级职称英语 计算机考试时间2016,浙江省2016年度全国专业技术人员职称外语等级统一考试时间...
- 【论文阅读】Computational Personality: A Survey 计算性格学综述
- plpgsql 编译执行
- 10分钟看懂财务报表分析,只需掌握一个公式!
- 内存单元地址求字节大小的计算方法
- 品牌建设—长效且动态的关系管理进程:赫联电子亚太区
- python关于二手房的课程论文_python爬取链家二手房信息
- ZY Player 2.8.3 中文版 (全网视频播放器)
- Win11玩不了红警怎么办?Win11玩不了红警解决方法分享
- r语言 求几个数的最小公倍数_一课研究之“最小公倍数教学后学生知识技能情况分析”(20190417)...
热门文章
- 电商全渠道秩序维护 八爪鱼大数据来帮忙
- Quaternion.Euler调整记录
- 工业互联网-工业企业大数据交换通道-数据通道产品描述
- 单片机与计算机串行通信原理图,PC与51单片机之间RS232串行通信电路原理图/源码等...
- 小蚁摄像机刷固件开放rtsp等其他功能并接入HomeAssistant
- linux下如何使用sftp命令
- 笔记本电脑网络重置后,无线网和有线网都连接不上了,而且图标还消失了,在设备管理器里面还显示网卡感叹号。
- 异常检测的N种方法,这次全都盘出来了
- 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读
- Dependency‘org.framework:spring-webmvc:’ not found