VRTK3.3射线用代码控制
要想用代码控制射线,首先要搞清楚射线是怎么形成的,射线有主要是组件vrtk_pointer和组件vrtk_UIPoinrer, 组件vrtk_pointer是发射一条可见的渲染射线并不能点击UI,就是给你看的,实际与UI产生交互的是vrtk_UIPoinrer组件,组件vrtk_UIPoinrer是发射一条不可见但可与UI交互的射线,SteamVR Home的射线效果就是由一条不可见但可与UI交互的射线实时检测,射线是否在UI上,是在UI上则显示一条可见的渲染射线,否则隐藏。
以下是vrtk_UIPoinrer组件源码,则可调用PointerActive()函数判断是否发射一条不可见但可UI交互的射线:
以下是vrtk_pointer组件源码,则可调用IsPointerActive()函数判断是否发射一条可见但不可UI交互的渲染射线及用Toggle()函数控制射线开启与关闭:
则可如下设置:
不用手柄的按钮来改变射线的状态,两个的ActivationButton都设为Undefined,这样vrtk_UIPoinrer组件只要将ActivationMode在HoldButton与AlwaysOn的切换,就可以让这不可见的射线是启用或关闭,组件vrtk_pointer则用IsPointerActive()函数和Toggle()函数,来控制这渲染射线的开启或关闭。
核心代码,如下:
//当前射线组件static VRTK_Pointer vRTK_Pointer;//实际UI射线组件static VRTK_UIPointer vRTK_UIPointer;//右手控制器VRTK_ControllerEvents controllerEvents;void OnEnable(){//获取射线组件vRTK_Pointer = GetComponent<VRTK_Pointer>();//实际UI射线vRTK_UIPointer = GetComponent<VRTK_UIPointer>();//获取手柄控制器controllerEvents = GetComponent<VRTK_ControllerEvents>();}/// <summary>/// 开启或关闭射线/// </summary>/// <param name="isBool">是否开启射线</param>public static void vRTKPointer(bool isBool)
{bool b = vRTK_Pointer.IsPointerActive();//实际射线模式切换vRTK_UIPointer.activationMode=isBool? VRTK_UIPointer.ActivationMethods.AlwaysOn: VRTK_UIPointer.ActivationMethods.HoldButton;//已经开启则返回,未开启则继续if (isBool ? b : !b) return;//渲染射线状态切换操作vRTK_Pointer.Toggle(true);vRTK_Pointer.Toggle(false);}
只要挂载脚本,则可以控制射线的开启和关闭。
完整的脚本:
using UnityEngine;
using VRTK;public class rightControllerEvent : MonoBehaviour
{//当前射线组件static VRTK_Pointer vRTK_Pointer;//当前射线渲染组件static VRTK_StraightPointerRenderer vRTK_StraightRenderer;//实际UI射线组件static VRTK_UIPointer vRTK_UIPointer;//右手控制器VRTK_ControllerEvents controllerEvents;//若该键被禁用,则返回public static bool isDisableTouch;//当前是否有其它UI占用public static bool isOccupyUI;//记录菜单键public static bool isPressed;public GameObject[] gameObjects;void OnEnable(){isPressed = true;//获取射线组件vRTK_Pointer = GetComponent<VRTK_Pointer>();//获取射线渲染组件vRTK_StraightRenderer = GetComponent<VRTK_StraightPointerRenderer>();//实际UI射线vRTK_UIPointer = GetComponent<VRTK_UIPointer>();//获取手柄控制器controllerEvents = GetComponent<VRTK_ControllerEvents>();//防止有UI时,手柄断开射线失效foreach (GameObject go in gameObjects){if (go.activeSelf){vRTK_Pointer.activateOnEnable = true;break;}}if (controllerEvents == null)return;controllerEvents.ButtonTwoPressed += DoButtonTwoPressed;controllerEvents.TriggerPressed += DoTriggerPressed;}void OnDisable(){vRTK_Pointer.activateOnEnable = false;if (controllerEvents == null)return;controllerEvents.ButtonTwoPressed -= DoButtonTwoPressed;controllerEvents.TriggerPressed -= DoTriggerPressed;}public static void setvRTK_StraightRenderer(int n=0){float[] raySizeArr = { 0.0012f, 0.0008f };vRTK_StraightRenderer.scaleFactor = raySizeArr[n];}/// <summary>/// 开启或关闭射线/// </summary>/// <param name="isBool">是否开启射线</param>public static void vRTKPointer(bool isBool){bool b = vRTK_Pointer.IsPointerActive();//实际射线模式切换vRTK_UIPointer.activationMode=isBool? VRTK_UIPointer.ActivationMethods.AlwaysOn: VRTK_UIPointer.ActivationMethods.HoldButton;//已经开启则返回,未开启则继续if (isBool ? b : !b) return;//渲染射线状态切换操作vRTK_Pointer.Toggle(true);vRTK_Pointer.Toggle(false);}//菜单void DoButtonTwoPressed(object sender, ControllerInteractionEventArgs e){//UI是否被占用,是则返回if (isOccupyUI) return;//菜单UI与射线的启用UIManager.Instance.setUI(1, isPressed);vRTKPointer(isPressed);isPressed = !isPressed;}public static void EnableButtonTwo(bool isBool){if (isBool){//不给调用菜单UIisOccupyUI = true;//关闭菜单UIUIManager.Instance.setUI(1, false);}else{//射线关闭vRTKPointer(false);//设为可触发isPressed = true;//给调用菜单UIisOccupyUI = false;}}//Trigger键void DoTriggerPressed(object sender, ControllerInteractionEventArgs e){//若该键被禁用,则返回if (isDisableTouch) return;switch (Manager.controllerStruct.interactObjectType) {case InteractObjectType.Touch:Manager.manageInvoke();break;}}
}
VRTK3.3射线用代码控制相关推荐
- [unreal4入门系列之十一] 在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...
- 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...
- 代码 控制unity 暂停 编辑器_Unity3D 报错解决方案及常用功能收集
1.在Dictionary迭代器进行修改: var _key = index2factionDic.Keys.GetEnumerator(); stringitem; while(_key.MoveN ...
- unity 关闭自己脚本_unity中使用代码控制脚本的开启和关闭 enabled
学习中遇到了使用enabled 来控制脚本的开关,中间遇到了一些问题,记录一下,以便遇到类似问题的新手同学少走弯路. 在想使用代码控制脚本的开启和关闭的时候,网上搜索到的解决方案是这样的: GameO ...
- 代码控制树视图 c# 1614262980
代码控制树视图 c# 1614262980 引入TreeView控件 添加根节点 方式一,实例化节点对象,添加到nodes集合中 方式二,直接添加,通过返回值获得节点 节点下面添加节点 展开节点 清空 ...
- android listview 向上自动滚动效果,Android通过代码控制ListView上下滚动的方法
本文将介绍一种通过代码控制ListView上下滚动的方法. 先上图: 按下按钮会触发ListView滚动或停止. 实现该功能并不难,下面给出主要代码MainActivity.java package ...
- c语言游戏人物控制,在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- Unity3D之NGUI基础5.1:代码控制UISprite
前文:https://blog.csdn.net/Jaihk662/article/details/86772975(UISprite显示图片) 一.UI其它创建方案 可以通过 NGUI→Create ...
最新文章
- cos2x = cos^2x-sin^2x的推导
- 如何居中“位置:绝对”元素
- 第二十讲 拉普拉斯变换求解线性ODE
- 天梯赛 L1-009 N个数求和 (20 分)
- Delphi中TFlowPanel实现滚动条效果
- 蜡笔小新里的钢达姆机器人怎么画_写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体...
- 企业应用程序集成简介
- java mongo api_MONGODB的javaAPI简单应用
- 36日期计算包含计算某月某日是星期几的公式
- PostgreSQL 12 正式发布
- Datastructure
- 复习笔记08 常用API
- POJ 2773 Happy 2006 (容斥原理)
- html+css的音乐网站
- IDEA查看源码时,CRTL+点击,方法或者变量不能提示出来,以便进入
- Elastic:使用 ElastAlert 发送 Slack 通知
- 期末前端web大作业:用DIV+CSS技术设计的动漫网站——火影忍者6页 带报告
- SEO 小白如何实现网站优化?
- [总结]好书的评判标准
- 如何在苹果手机上安装自制的AD证书