VRTK3.3射线用代码控制

9 篇文章 0 订阅

要想用代码控制射线,首先要搞清楚射线是怎么形成的,射线有主要是组件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)
        {
            //不给调用菜单UI
            isOccupyUI = true;
            //关闭菜单UI
            UIManager.Instance.setUI(1, false);
        }
        else
        {
            //射线关闭
            vRTKPointer(false);
            //设为可触发
            isPressed = true;
            //给调用菜单UI
            isOccupyUI = false;
        }
    }

    //Trigger键
    void DoTriggerPressed(object sender, ControllerInteractionEventArgs e)
    {
        //若该键被禁用,则返回
        if (isDisableTouch) return;
        switch (Manager.controllerStruct.interactObjectType) 
        {
            case InteractObjectType.Touch:
                Manager.manageInvoke();
                break;
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VRTK是一个用于构建虚拟现实应用程序的Unity框架。VRTK 3.3.0提供了一种简单的方法来检测射线与物体的碰撞。以下是一个简单的演示: 1. 首先,您需要在场景中创建一个VRTK_SDKManager对象。您可以通过从VRTK菜单中选择“Create Empty VRTK_SDKManager”来完成此操作。 2. 接下来,您需要将VRTK_SDKManager对象的“Scripting Define Symbols”字段设置为VRTK_DEFINE_SDK_MANAGER,并将其“SDK Setup”字段设置为“Simulator”. 3. 在场景中创建一个Cube对象,并将其放置在相机前面。 4. 将VRTK_SDKManager对象的“Scripting Define Symbols”字段设置为VRTK_DEFINE_SDK_MANAGER,并将其“SDK Setup”字段设置为“Simulator”. 5. 在场景中创建一个VRTK_Pointer对象,并将其放置在相机上。 6. 将VRTK_Pointer对象的“Activation Action”字段设置为“On Button Press”或“On Button Touch”,并将其“Pointer Origin Transform”字段设置为相机。 7. 在VRTK_Pointer对象上添加VRTK_StraightPointerRenderer组件。 8. 在VRTK_Pointer对象上添加VRTK_UIPointer组件。 9. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 10. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 11. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 12. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 13. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 14. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 15. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 16. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 17. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 18. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 19. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 20. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 21. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 22. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 23. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 24. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 25. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 26. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 27. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 28. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 29. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 30. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 31. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 32. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 33. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 34. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 35. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 36. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 37. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 38. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 39. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 40. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 41. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 42. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 43. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 44. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 45. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 46. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 47. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 48. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 49. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 50. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 51. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 52. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 53. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 54. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 55. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 56. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 57. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 58. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 59. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 60. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 61. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 62. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 63. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 64. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 65. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 66. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 67. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 68. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 69. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 70. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 71. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 72. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 73. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 74. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 75. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 76. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 77. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 78. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 79. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 80. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 81. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 82. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 83. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 84. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 85. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 86. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 87. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 88. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 89. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 90. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 91. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 92. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 93. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 94. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 95. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 96. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 97. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 98. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 99. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 100. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 101. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 102. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 103. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 104. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 105. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 106. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 107. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 108. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 109. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 110. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 111. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 112. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 113. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 114. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 115. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 116. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 117. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 118. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 119. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 120. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 121. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 122. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 123. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 124. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 125. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 126. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 127. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 128. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 129. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 130. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 131. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 132. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 133. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 134. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 135. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 136. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 137. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 138. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 139. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 140. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 141. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 142. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 143. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 144. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 145. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 146. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 147. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 148. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 149. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 150. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 151. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 152. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 153. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 154. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 155. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 156. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 157. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 158. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 159. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 160. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 161. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 162. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 163. 在VRTK_Pointer对象上添加VRTK_InteractGrab组件。 164. 在VRTK_Pointer对象上添加VRTK_InteractUse组件。 165. 在VRTK_Pointer对象上添加VRTK_InteractTouch组件。 166. 在VRTK_Pointer

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值