相关文章推荐
正直的棒棒糖  ·  dotnet publish 命令 - ...·  1 年前    · 
失眠的烤红薯  ·  Python ...·  1 年前    · 

为了以示区别,我们在更改支持的SDK前先等待3秒,在此时间内,只有电脑屏幕有画面,3s过后,我们可以看到VIVE头盔被激活。此时应注意在enable前,需等待一帧,否则会报错。

在添加了VR支持后,我们会发现在camera的Inspector面板中多出如图2所示的几个选项。

// Position of node local to its tracking space. // /// public static Vector3 GetLocalPosition(VRNode node); // Summary: // /// // The current rotation of the requested VRNode. // /// // Parameters: // node: // Node index. // Returns: // /// // Rotation of node local to its tracking space. // /// public static Quaternion GetLocalRotation(VRNode node); // Summary: // /// // Center tracking to the current position and orientation of the HMD. // /// public static void Recenter();

以下,我们通过一个简单的示例来演示如何使用InputTracking类来模拟手柄。

  • 新建两个cude,一个命名为LeftHand,一个命名为RightHand. Cube的scale设为0.2。
  • 然后新建一个empty game object,命名为Virtual man,作为手柄和相机的父物体。
  • 把main camera和LeftHand, RightHand拖到Virtual man下面,并将其位置归为0。
    新建脚本RightHand.cs和LeftHand.cs,分别关联到LeftHand, RightHand上。
    在Update函数中写:
  •         this.transform.localPosition = InputTracking.GetLocalPosition(VRNode.RightHand);
            this.transform.localRotation = InputTracking.GetLocalRotation(VRNode.RightHand);
    

    LeftHand脚本中做出相应的替换即可。

    运行程序,我们就可以看到手柄变成了两个cube。

    手柄的按键

    HTC VIVE手柄的按键可以在Edit->Project Setting->Input中设定。
    首先,我们需要找到HTC VIVE手柄对应的ID号,在unity的官网上可以找到其对应的信息:

    https://docs.unity3d.com/Manual/OpenVRControllers.html
    
  • 首先,我们以RightHand和LeftHand为父物体,各添加一个空物体。
  • 然后在空物体上添加Line Renderer组件。
  • 新建一个材质,将其shader改为Unlit/Color,并将其添加到Line Renderer上,这样我们就可以更改射线的颜色。
  • Line Renderer的设置信息参考如下:
  • Debug.Log(hit.transform.name); hit.transform.GetComponent<UnityEngine.UI.Button>().OnSubmit(new BaseEventData(EventSystem.current));

    使用这种方法对于UI的通用性比较差,如果我们在添加toggle或是其他UI组件,就要重新的GetComponent,比较麻烦,为此,我们可以采取以下的做法。

  • 首先,我们在场景中在新建一个UI toggle。然后在ButtonClick函数中添加如下的函数:
  •     public void Do2()
            Debug.Log("Press the toggle");
    
  • 然后在toggle上的onClick()中添加如下:
  • Debug.Log(hit.transform.name); // hit.transform.GetComponent<UnityEngine.UI.Button>().OnSubmit(new BaseEventData(EventSystem.current)); ExecuteEvents.Execute<ISubmitHandler>(hit.transform.gameObject, new BaseEventData(EventSystem.current), ExecuteEvents.submitHandler);