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]设置成它的子物体,最终如下图所示:

 

 vrtk 使用教程(一)_第1张图片

关联steamvr组件成功后,点击VRTK_SDKManage的Auto Populate,将setup关联,最终如下

vrtk 使用教程(一)_第2张图片

 

在vrtk下新建两个空物体,作为左右手柄的控制器,不要在steam的左右手柄控制器上使用。在空物体上添加如下组件,vrtk_Straight Pointer Render 托给vrtk_pointer的pointer render属性

 

vrtk 使用教程(一)_第3张图片

vrtk 使用教程(一)_第4张图片

vrtk 使用教程(一)_第5张图片

1,实现瞬移功能

在vrtk上挂载 vrtk_Height Adjust Teleport组件,将对应手柄的监测层级更改即可实现瞬移。将地面层级设置为road,监测的层级去除road即可。

2,交互ui

将要与ui交互的手柄添加vrtk_UIPointer组件,将2D画布改为woldSpace,调整大小,添加vrtk_UICanvas组件。如下图

vrtk 使用教程(一)_第6张图片

activetionmode改为AlwaysOn,此时射线会想鼠标触发一样触发按钮高亮。

如果要隐藏画布操作,在打开时会无法响应事件,所以有此操作的要将eventsystem放到外部,不要放到canvas下

 

3,设置完手柄控制器,要讲这两个物体赋值给VRTK_SDKManage组件,如下图

vrtk 使用教程(一)_第7张图片

4,手柄各种事件的绑定,这里实现的了一部分事件,是对事件的统一管理类,可以根据情况使用。

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

//委托
public delegate void OnClicked();//按键
public delegate void OnPressed();//按下

/// 
/// 手柄的事件
/// 
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();
        }
    }
}

 

你可能感兴趣的:(代码,知识点,Vrtk,STEAMVR,unity)