vrtk使⽤教程(⼀)
.steamvr作为⼀个⾮常好⽤的vr插件,美中不⾜的需要⾃⼰实现各种交互,还是⽐较⿇烦。这⾥推荐⼤家⼀个插件vrtk,对steamvr的封装,严格说不只是steamvr,是对vr插件的封装,不多说,使⽤教程如下,还是很简单的
⼀,下载,
⼆,使⽤
新建空物体,取名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();
}
unity 教程}
//左⼿圆盘按下
private void LeftHander_TouchpadPressed(object sender, ControllerInteractionEventArgs e) {
if (!leftEnable) return;
Debug.Log("圆盘按下");
if (Left_Touchpad_Pressed !=null)
{
Left_Touchpad_Pressed.Invoke();
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论