要想用代码控制射线,首先要搞清楚射线是怎么形成的,射线有主要是组件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射线用代码控制相关推荐

  1. [unreal4入门系列之十一] 在UE4中编写C++代码控制角色

    当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...

  2. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  3. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...

  4. 代码 控制unity 暂停 编辑器_Unity3D 报错解决方案及常用功能收集

    1.在Dictionary迭代器进行修改: var _key = index2factionDic.Keys.GetEnumerator(); stringitem; while(_key.MoveN ...

  5. unity 关闭自己脚本_unity中使用代码控制脚本的开启和关闭 enabled

    学习中遇到了使用enabled 来控制脚本的开关,中间遇到了一些问题,记录一下,以便遇到类似问题的新手同学少走弯路. 在想使用代码控制脚本的开启和关闭的时候,网上搜索到的解决方案是这样的: GameO ...

  6. 代码控制树视图 c# 1614262980

    代码控制树视图 c# 1614262980 引入TreeView控件 添加根节点 方式一,实例化节点对象,添加到nodes集合中 方式二,直接添加,通过返回值获得节点 节点下面添加节点 展开节点 清空 ...

  7. android listview 向上自动滚动效果,Android通过代码控制ListView上下滚动的方法

    本文将介绍一种通过代码控制ListView上下滚动的方法. 先上图: 按下按钮会触发ListView滚动或停止. 实现该功能并不难,下面给出主要代码MainActivity.java package ...

  8. c语言游戏人物控制,在UE4中编写C++代码控制角色

    当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...

  9. Unity3D之NGUI基础5.1:代码控制UISprite

    前文:https://blog.csdn.net/Jaihk662/article/details/86772975(UISprite显示图片) 一.UI其它创建方案 可以通过 NGUI→Create ...

最新文章

  1. cos2x = cos^2x-sin^2x的推导
  2. 如何居中“位置:绝对”元素
  3. 第二十讲 拉普拉斯变换求解线性ODE
  4. 天梯赛 L1-009 N个数求和 (20 分)
  5. Delphi中TFlowPanel实现滚动条效果
  6. 蜡笔小新里的钢达姆机器人怎么画_写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体...
  7. 企业应用程序集成简介
  8. java mongo api_MONGODB的javaAPI简单应用
  9. 36日期计算包含计算某月某日是星期几的公式
  10. PostgreSQL 12 正式发布
  11. Datastructure
  12. 复习笔记08 常用API
  13. POJ 2773 Happy 2006 (容斥原理)
  14. html+css的音乐网站
  15. IDEA查看源码时,CRTL+点击,方法或者变量不能提示出来,以便进入
  16. Elastic:使用 ElastAlert 发送 Slack 通知
  17. 期末前端web大作业:用DIV+CSS技术设计的动漫网站——火影忍者6页 带报告
  18. SEO 小白如何实现网站优化?
  19. [总结]好书的评判标准
  20. 如何在苹果手机上安装自制的AD证书

热门文章

  1. pod健康检查之容器的存活探针、就绪探针、启动探针
  2. iOS-基础-数据类型
  3. 宽带波形测试软件,如何让超宽带(UWB)信号测试变得简单易行?
  4. HTML:img图片找不到时 什么都不显示
  5. .NET基础拾遗(3)字符串、集合和流
  6. linux bridge 网桥详解
  7. Java--GUI编程
  8. 无盘主机服务器,无盘主机服务器视频
  9. 编写良好的代码:如何减少代码的认知负荷
  10. 手把手教你做视频播放器(六)-竖屏的播放界面