.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();
}
}
}