HTC VIEW丨14. 使用激光指针与物体交互:一直显示激光——(VR交互机制3-Use)

Use两种实现方式:

1、使用手柄点击,按下Trigger键触发

2、使用激光指针悬停在物体上,按下Trigger键

 

2019.06.26更新:

写了一套逻辑,只要勾选isHTC,自动帮你把UI从PC版转成VR版。取消勾选,程序回到PC版。

 

例子:实现手柄射线与物体的交互

1、VRTK的初步设置

2、给要捡起的cube进行配置(2-4完成射线触碰物体变色,实现选中状态)(5也要做第4步)(红色必做!)

3、给手柄控制器进行配置,完成射线选中效果。

a、添加VRTK_Interact Use

b、勾选VRTK_Pointer的Interact With Object。实现射线与物体的交互,可出现选中效果。

若不勾选,则只实现手柄触碰到之后才交互。

4、添加VRTK_InteractUse_UnityEvents

5、给要交互的物体添加Collider,挂载自己定义的事件的新脚本

注意:因为4步以前我们添加了射线击中变黄事件,自动添加了VRTK_InteractableObject组件,而我们下面方法继承了VRTK_InteractableObject该组件,因此一定要先删除原先添加的组件!

我们也可删掉通过自动配置自动添加的组件,直接添加我们写的代码,这一个脚本也能实现功能!


    
    
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using VRTK;
  4. public class Skode_BtnSelect : VRTK_InteractableObject
  5. {
  6. // 开始使用:默认扣动扳机键
  7. public override void StartUsing(GameObject currentUsingObject)
  8. {
  9. base.StartUsing(currentUsingObject);
  10. #region 自定义
  11. var value = GetComponent<Button>().onClick;
  12. if ( value != null)
  13. {
  14. value.Invoke();
  15. }
  16. #endregion
  17. }
  18. // 停止使用:默认松开扳机键
  19. public override void StopUsing(GameObject previousUsingObject)
  20. {
  21. base.StopUsing(previousUsingObject);
  22. #region 自定义
  23. #endregion
  24. }
  25. }

 

Hold Button To Use:如果勾选,控制器上的使用(use)按钮需要被持续按下来保持使用/(“需要长时间按下,来触发Use事件”——来自某牛)

Use Only if Grabbed:当被抓取的时候,属性才能被使用

Pointer Activates Use Action:(“只要激光击中物体,不需要Trigger的按下,就是可以使用的。不勾选,则只有按下时,才可激活Use事件”——来自某牛)/(勾选该选项,不勾选Hold Button To Use,当指针在对象上的时候就会运行对象的StartUsing方法

关于横线删除:网上博客都说的是删除文字内容,但我实际测试结果是:

1、同时勾选HoldButtonToUse和PointerActivatesUseAction,只要当激光射线第一次指到该物体时,立刻触发且仅触发一次use事件,不需长按,没有重复触发。

2、只勾选HoldButtonToUse,并不需要长按Trigger,还是只要按下就触发

希望有了解的朋友确认问题。

 

需要注意的是:右手手柄按下扳机键点击物体想触发Use事件,要在此时关闭瞬移效果

原先:右手手柄按下圆盘键激光击中物体,按下扳机键,触发Use事件。当松开圆盘键时,还会传送到物体位置

希望:松开圆盘键后,不要传送到物体位置。

关闭方法0:

设置传送限制规则。

关闭方法1:

右手手柄VRTK_InteractUse_UnityEvents——Toggle为false

 

激光与UI的交互:

单纯实现与UI Collider的交互,直接用上面的“与物体的交互”就OK了,但要实现UI Scroll View的滑动效果,则还要:
1、先完成与物体交互手柄的操作步骤,UI上可不添加Interactable

2、在想要交互的手柄上,比如RightController,添加VRTK_UIPointerVRTK_ControllerUIPointerEvents_ListenerExample脚本。

3、在想要交互的Canvas上挂载VRTK_UICanvas组件

 

这时我们会发现我们虽然能实现效果,但是射线穿透UI了。这是因为虽然VRTK_UICanvas在Canvas上自动生成了Boxcollider,但是我们Canvas里面的内容不和Canvas在一个平面。这导致射线检测不到碰撞器,穿透了。所以我们:

要不然就把下面的物体放在和Canvas同一个平面上

要不然注释掉给canvas添加collider的代码,自己给不同位置的UI添加collider

 

 

激光指针抓取物体

实现效果:按下圆盘键触发激光,按下Grab键将物体吸附在激光顶端。(不勾选,使用Use方法抓取物体,是使用的Trigger键)

注意:你要用自己继承了VRTK_InteractableObject的脚本,记得配置如下选项(用VRTK配置生成的则自动配置好了)

1、勾选右手VRTK_Pointer——GrabToPointerTip

2、去掉要抓取物体的右手吸附点。

若是设置了吸附点,则不会吸附在射线顶端,而是实现吸附点的抓取。

 

 

VR让射线一直显示的方法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值