vrtk 使用教程(一)

.steamvr作爲一個非常好用的vr插件,美中不足的需要自己實現各種交互,還是比較麻煩。這裏推薦大家一個插件vrtk,對steamvr的封裝,嚴格說不只是steamvr,是對vr插件的封裝,不多說,使用教程如下,還是很簡單的

 

一,下載,

 assetstore搜索vrtk下載最新版本,但是最新版本和最新的steamvr好像兼容有些問題,這裏採用的是老版本,steamvr也是老版本。想要的可以去這裏下載https://download.csdn.net/download/nt_xs_j/10981584

二,使用

  新建空物體,取名VRTK,添加組件VRTK_SDKManager,新建空物體作爲它的子物體,取名Setup,掛載VRTK_SDK Setup組件,quickselect 選擇steamvr ,將steamVR的相機預設[[CameraRig]設置成它的子物體,最終如下圖所示:

 

 

關聯steamvr組件成功後,點擊VRTK_SDKManage的Auto Populate,將setup關聯,最終如下

 

在vrtk下新建兩個空物體,作爲左右手柄的控制器,不要在steam的左右手柄控制器上使用。在空物體上添加如下組件,vrtk_Straight Pointer Render 託給vrtk_pointer的pointer render屬性

 

1,實現瞬移功能

在vrtk上掛載 vrtk_Height Adjust Teleport組件,將對應手柄的監測層級更改即可實現瞬移。將地面層級設置爲road,監測的層級去除road即可。

2,交互ui

將要與ui交互的手柄添加vrtk_UIPointer組件,將2D畫布改爲woldSpace,調整大小,添加vrtk_UICanvas組件。如下圖

activetionmode改爲AlwaysOn,此時射線會想鼠標觸發一樣觸發按鈕高亮。

如果要隱藏畫布操作,在打開時會無法響應事件,所以有此操作的要將eventsystem放到外部,不要放到canvas下

 

3,設置完手柄控制器,要講這兩個物體賦值給VRTK_SDKManage組件,如下圖

4,手柄各種事件的綁定,這裏實現的了一部分事件,是對事件的統一管理類,可以根據情況使用。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK;

//委託
public delegate void OnClicked();//按鍵
public delegate void OnPressed();//按下

/// <summary>
/// 手柄的事件
/// </summary>
public class HandlerEvent : MonoBehaviour
{
    [SerializeField ]
    private  VRTK_ControllerEvents leftHander, rightHander;//左右手柄

    public static bool leftEnable, rightEnable;//手柄是否可以使用

    public static OnClicked Left_Trigger;//左手扳機鍵
    public static OnClicked Right_Trigger;//右手扳機鍵
    public static OnPressed Left_Touchpad_Pressed;//左手圓盤按下
    public static OnPressed Right_Touchpad_Pressed;//右手圓盤按下

    // Use this for initialization
    void Start ()
    {
        leftEnable = rightEnable = true;
        //左手事件註冊
        leftHander.TriggerClicked += LeftHander_TriggerClicked;
        leftHander.TouchpadPressed += LeftHander_TouchpadPressed;

        //右手事件註冊
        rightHander.TriggerClicked += RightHander_TriggerClicked;
        rightHander.TouchpadPressed += RightHander_TouchpadPressed;
    }
    //右手扳機按下
    private void RightHander_TriggerClicked(object sender, ControllerInteractionEventArgs e)
    {
        if (!rightEnable) return;
        if (Right_Trigger !=null)
        {
            Right_Trigger.Invoke();
        }
    }
    //右手圓盤按下
    private void RightHander_TouchpadPressed(object sender, ControllerInteractionEventArgs e)
    {
        if (!rightEnable) return;
        if (Right_Touchpad_Pressed != null)
        {
            Right_Touchpad_Pressed.Invoke();
        }
    }

    //左手柄按下
    private void LeftHander_TriggerClicked(object sender, ControllerInteractionEventArgs e)
    {
        if (!leftEnable ) return;
        Debug.Log("左手柄按下");
        if(Left_Trigger !=null)
        {
            Left_Trigger.Invoke();
        }
    }
    //左手圓盤按下
    private void LeftHander_TouchpadPressed(object sender, ControllerInteractionEventArgs e)
    {
        if (!leftEnable) return;
        Debug.Log("圓盤按下");
        if (Left_Touchpad_Pressed !=null)
        {
            Left_Touchpad_Pressed.Invoke();
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章