steamvr vrtk和vrtk有什么区别

请完成以下验证码
您当前的位置: &
Unity Steam_VR开发工具插件---VRTK 自带案例分析
查看: 1134|
DEMO 1 &查询硬件手柄头显在TK插件 的第一个demo & 001_Camerig_VR_PlayArea 案例&这个demo 显示的功能: &按下任一手柄上的按键,便载入下一个场景&找到demo场景中##Scene Changer## 游戏物体,打开附加的scene changer脚本里面有两个核心的类,以及几个重要的API&VRTK_DeviceFinder类 : 用于在场景中寻找左右手柄,头显,返回硬件编号或手柄,头显的gameobject重要的API &: &获得左右手柄的游戏物体VRTK_DeviceFinder.GetControllerRightHand();&VRTK_DeviceFinder.GetControllerLiftHand();获得左右手柄对应的硬件编号VRTK_DeviceFinder.GetControllerIndex(rightHand)按下手柄任一按键或键盘上的空格键,加载下一个场景ForwardPressed 用于侦测手柄的按键是否按下&上图中引入第二个重要的类: VRTK_SDK_Bridge这是插件封装了 VR 的比较底层的API:&VRTK_SDK_Bridge.IsTriggerPressedOnIndex(controllerIndex)&输入硬件的编号,返回是否按下的布尔值.DEMO 2手柄的输入事件封装成VRTK_ControllerEvent脚本针对VR中常见的交互动作: &UI点击, 抓住物体, 触发物体功能 等, 自定义手柄按键,绑定这些动作.&pointerToggleButton :激光的显示开关, 激光在VR里相当于鼠标箭头的指向功能.pointerSetButton: 激光停留的指向目标,触发目标的功能. & 相当于鼠标点击;grabToggleButton: &抓住物体动作, &配合使用VRTK插件集成的抓取,投掷功能.useToggleButton: &触发目标事件, &比如把手柄放在门把手上,按下这个按键,触发门打开的功能,手柄放在电灯开关上,按下按键,触发电灯开发的功能.这个和pointerSetButton区别在于后者需要激光落在目标上,才能触发目标上的功能uiClickButton :触发UI Canvas 目标的事件menuToggleButton: 游戏目录显示开关axisFidelity: &按键按下的强度,完全按下是1,松开时是0, & 现在只有Trigger按键(手部后面扳机)有此属性triggerClickThreShold: &扳机要到多大程度,才能使用扳机的触发功能. & 如果是0.5 ,则表示只要按下一半的程度就可以触发,如果是1,则必须完全按下才能触发.以上是设置各个按键在插件中交互的功能&如果要获得每个按键具体的使用情况,如按下,松开按键,手触摸板的按键位置,扳机的按下强度,则需要在VRTK_ControllerEvent注册对应按键的事件&在VRTK_ControllerEvents_ListenerExample脚本中,监听了VRTK_ControllerEvent所有按键的事件,和按键的参数信息&如 下图见图的扳机键的按键事件事件的参数是手柄的硬件编号, 按钮的按下程度值(扳机键专有的属性), 触摸板的触摸位置和角度(触摸板专有的属性)&&DEMO 003_Controller_SimplePointer传送位置VRTK_Simple Pointer类该脚本继承自VRTK_WorldPointer功能的核心是将玩家的位置传送到激光所指落在的地方,&该脚本应默认放在手柄的prefab上其他的参数设置激活颜色,传送时是否显示玩家活动区域, 激光有效触碰的层,激光的粗细等&DEMO 004_CameraRig_BasicTeleportVRTK_BasicTeleport该脚本配合继承自VRTK_WorldPointer的子类 如VRTK_Simple Pointer, &添加此脚本后才可以位移传送参数1: 传送时黑屏 & 模拟眨眼动画,过渡更自然2: 黑屏时间 &随传送距离远近成正比的黑屏时间 & 假如传送的位置比较远,则黑屏时间更久, 数值越大,黑屏时间越长,数值为0时,不受距离远近影响3: 头部位置 & 以头部为基准,作为传送的位置, &未打钩,则是玩家可玩区域的中心位置作为传送的目标点. & 可玩区域不能和游戏环境交叉.最大化玩家活动空间4:禁止传送物体的标签 &如果传送的目标位置的物体标签和此相同,则不能传送5:作为第四个功能的补充 &可以添加VRTK_TagOrScriptPolicyList脚本中添加多个禁止传送的物体标签6 & & & & & navemesh 边缘限制 & 在navemesh上传送,如果在navemesh的边界,则禁止传送,数值是离边界的距离范围.& &&&DEMO 005_Controller_BasicObjectGrabbing抓取物体&手柄上添加的组件VRTK_InteractGrab&这个脚本用来抓取物体, 抓的按键在VRTK_ControllerEvent 脚本中设置controllerAttachPoint: & 被抓的物体,被附加在哪个物体上, &默认是手柄的圆环处HideController On Grab &抓住物体时,隐藏手柄Hide Controller Delay & 延迟几秒后隐藏手柄Grab Precognition & 提前预判抓取物体 & 对应快速运动的物体,我们可能需要提早按下抓取按键才能抓住物体, 数值是提前的时间值,值越大, 可提前的抓取时间越长&Throw Multiplier: 把物体扔出去时,速度的倍增值Create Rigid Body When Not Touch : &在碰到物体时才创建RigidBody & &默认情况下手柄也创建Rigidbody,这就可以和物体在物理上碰撞.&VRTK_InteractTouch和物体接触&Hide Controller On Touch &接触物体时隐藏物体Hide Controller Delay : &接触物体后延迟几秒后隐藏物体&Global Touch HighLight Color 如果被接触的物体上未设置接触高亮颜色,则用此颜色来对改变目标的颜色&Custom RigidBody Object 自定义用于判定接触的刚体物体, 如果没有的话,会自动在子层级创建一个刚体物体&交互物体上应该添加的脚本&VRTK_InteractableObject &需要有rigidbody组件和collider组件&1 Touch options & 接触HighLight OnTouch 接触时高亮显示物体颜色Touch HightLight Color 高亮的颜色Rumble On Touch 接触时的反馈震动 & 强度和时间Allow Touch Controller & 规定哪个手柄可以接触这个物体Hide Controller On Touch &覆盖是否隐藏手柄的设置 & default是根据手柄的设置&&2 Grab Options & 抓取IsGrabbable &是否可以被抓取Is droppable 松开时是否掉落Is swappable 是否可替换 &如果不行 则必须先把物体丢掉Hold Button To Grab 按住才能保证物体不掉落&Grab Override Button 覆盖手柄的抓取按键设置Rumble On Touch 接触时震动 同上Allowed Grab Controllers规定哪个手柄可以接触这个物体&Precision Grab 精准抓取 & 如果是,则抓取的位置是刚接触到物体的点,而不是默认的物体中心位置Right Left Snap Handle 被抓物体的抓取点, 该游戏物体应该放在被抓物的子层级下&StayGrabbed On Teleport 传送后仍然抓住物体 否则物体丢掉&GrabAttach Mechanic &被抓物体的依附机制 &Fixed_joint &链接到fixed Joint 上,这是比较常用的物理上的固定位置链接&Spring_joint 和Fixed Joint类似 但是有点手臂关节,可以拉伸弯曲伸直, & track Object &不靠joint 链接 而是让被抓物跟随手柄的位置方向, &rotator _Track 比较适合门,车驾驶把手这种 有固定转轴的物体,它只能在受转轴的约束下,根据手柄的抓取位置来调整旋转, child of controller 作为手柄的子物体, climbable &固定不动的交互物体&&3 Use options & 使用Use only if Grabbed &只有在被抓取时才可以被使用Hold Button to Use 长按手柄按键才可以使用Use Override Button 自定义操作按键Pointer activates Use Action &如果打钩 &当手柄发射的激光落在交互物体上,于此同时如果Holon to use没有打钩,则使用该物体, &Holon to use打钩了,则要按住使用按键才可以使用该物体该脚本可以 为交互物体增加一个外轮廓颜色&VRTK_InteractableObject扩展DEMO 006_Controller_UsingADoor&该例子用了一个开门的交互来扩展VRTK_InteractableObject 脚本接触VRTK_InteractableObject类&覆盖开始使用物品的方法在此方法中写入交互动作的逻辑方法&此外还有物体被接触时,抓取时,接触接触,结束抓取动作发生时调用的函数,&可以覆盖此方法,自定义扩展你的交互动作.&注意手柄上应该添加下图脚本,否则无法使用物体DEMO 007_CameraRig_HeightAdjustTeleport &高度升降传送此脚本继承VRTK_BasicTeleport, &不像DEMO 4场景只能水平面平移传送, &它可以传送高低不同的地面,而且还可以模拟走上下楼梯的位移感&上图中红框中是扩展的功能参数&Play space falling 是否能下落Play space fall restriction 下落条件, 规定哪个手柄位于当前平面内,就不会下落&Use gravity 是否自由落体加速度Gravity Fall Height 超过多少高度差,才开始自由落体&Blink Y threshold &高度落差超过多少值时,才会模拟黑屏眨眼的效果Floor Height Tolerance &找过这个数值时,才会有上升和下降的位移&DEMO 008_Controller_UsingAGrabbedObject和第6个场景原理类似,都是继承VRTK_InteractableObject 脚本,物品的使用功能拓展&&DEMO 009_Controller_BezierPointer抛物线传送侦测&和VRTK_Simple Pointer功能类似 &,不同的使用用抛物线来代替激光直线获取传送的位置红框内是额外的参数, &设置抛物线的最长有效距离, &抛物线 中的物体, 落地的光标物体设置等,没有什么额外特别的东西&&DEMO 010_CameraRig_TerrainTeleporting地形传送&此例子没有演示新的功能,只是展示了可以在地形上传送DEMO 011_Camera_HeadSetCollisionFading头部碰撞到物品后黑屏眨眼效果, 提示玩家已经和游戏中物体相接触,让其返回到正常的区域&附加在Camera(eye) 上DEMO 012_Controller_PointerWithAreaCollision传送的位置附近的物品如果和玩家可活动范围碰撞器的相接触,将影响传送位置的最终位置,使其在合理的范围内&开启可玩区域碰撞体DEMO 013 演示了多个物体抓取和使用的功能&DEMO 014 演示了抓取物品握住的位置主要是这里的参数设置,这些参数的意义之前已经有说明&&DEMO 015_Controller_TouchpadAxisControl&演示手指在手柄触摸板的触摸位置 vector2 (x,y),来控制小车的移动方向, 手柄的扳机,控制小车跳起的动作&基本思路是 一个脚本监听手柄的输入事件, 将事件的相关值传入到小车的控制器&监听手柄按键传入到小车的控制运动的脚本小车的运动部分函数DEMO 016_Controller_HapticRumble手柄震动&当蓝色盒子上的剑和红色盒子撞击时,触发手柄震动基本思路是剑的物体碰撞器侦测到碰撞时,获取手柄的运动速度,来决定震动的强度&如下图, &controllerAction和ControllerEvents对应的手柄身这两个脚本关键的震动方法是 &有VRTK.ControllerAction.TriggerHapticPulse ( 震动强度, 震动持续时间,震动间隔时间)&&DEMO &017_CameraRig_TouchpadWalking使用触摸板来控制人物行走,以及在低矮的洞穴中蹲走时碰到头顶的碰撞体,返回到能正常直立站立的位置&附加在此物体上VRTK_PlayerPresence 让人物有碰撞体, 且头部上方有碰撞体时,如果不蹲着走,就会强制返回可以正常站立的位置&HeadSet Y position 头部碰撞体离头顶向下的偏移值, 这样可以通过更矮的挡板&Ignore Grabbed Collisions &忽略交互物体的碰撞效果,建议勾上Reset Position On Collision 在低矮的洞穴中蹲走时碰到头顶的碰撞体,返回到能正常直立站立的位置Falling physics only 如果打钩,则可以自由落体下降&VRTK_TouchpadWalking通过触摸板的触摸位置来定位移动方向&参数: &leftController ,rightController如果勾选则可以控制移动Max Walk Speed 最大行走速度, &如果触摸位置离中心位置越近,移动速度越慢&Deceleration &行走结束时的减速效果,防止恶心MoveOnButtonPress &按下哪个按键时才能触发移动(前提触摸板也要输入)Device For Direction &移动的方向 以哪个设备为基准 & & 头显朝向,还是左右手柄的正方向&&DEMO &018_显示当前帧数&把这个prefab 拖到场景中就可以显示当前帧数DEMO 019_Controller_InteractingWithPointer用手柄激光和物体交互&VRTK_interactionObject的 pointer activates use 打钩后,就可以用激光和物体交互,如果HolonToUse 没有勾选,那么激光落在物体上,就直接使用该物体,&如果 &HolonToUse勾选了,那就需要激活指在物体上,同时按下扳机按键,才使用物体DEMO 020_CameraRig_MeshTeleporting在各种形状的网格上传送激活指针传送和抛物线在复杂网格上的传送效果,没有新的功能演示&&&DEMO 021_Controller_GrabbingObjectsWithJoints物体不同的交互方式&打开宝箱盒子的上半部分添加转轴组件设置转轴的转动轴向,位置,就可以像真实打开箱子一样.&箱子的把手需要添加以下脚本VRTK_Interactable Object 是必须要添加的脚本,它保证可以被手柄抓取 &rigidbody和fiexed joint是用来连接上半部分的盒子,固定把手的位置有一定活动区间关节物体使用character joint 来确定上下关节的连接关系(每个关节也要添加rigidbody 组件)其关节上的VRTK_InteractableObject 的Grab Attach Mechanic 要设置成spring_joint
微信扫一扫
专注于VR的学习、开发和人才交流
&津ICP备号unity5 - Fallback Headset SDK being used in VRTK_SDKManager - Stack Overflow
Improve your security with
Dance Dance Authentication
Now available on Stack Overflow.
I just reopened a VR project, for the HTC Vive, in Unity 5.5.0f3, after a 2 month hiatus, and upgraded VRTK and SteamVR to their latest.
When I run my project, I'm getting console errors, telling me
"Fallback Boundaries SDK is being used"
"Fallback Headset SDK being used"
and I should choose "
the GameObject with the VRTK_SDKManager"
and select them there.
Problem is that I'm relatively certain I have no VRTK_SDKManager used anywhere in my app.
Is this a new class or a new requirement?
16.1k2982128
Yes, , updated package for 5.4.4 and 5.5.1 that contains VRTK_SDKManager Script. You should need to update the VRTK package but i will recommend you to stick with old if you don't have time cause maybe new update made enormous change ().
2,04641142
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
rev .25580
Stack Overflow works best with JavaScript enabled安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&虚拟现实学习笔记(1)
1、我们先来将SteamVR_Unity_Toolkit.unitypackage这个包导入,Asset Store里免费下载
2、当Unity熟练到一定程度,事件与委托是必备的基础!所以本文默认我们已经走过基础阶段。交互设计的精华也在于事件与委托的巧妙设计与实现。VR里的交互更不例外
这篇博客,从SteamVR_Unity_Toolkit的代码里剖析下,它是怎么封装SteamVR的事件的。
3、看类VRTK_ControllerEvents.cs
namespace VRTK{
using UnityE
using System.C
public struct ControllerInteractionEventArgs
public uint controllerI
public float buttonP
public Vector2 touchpadA
public float touchpadA
public delegate void ControllerInteractionEventHandler(object sender, ControllerInteractionEventArgs e);
public class VRTK_ControllerEvents : MonoBehaviour
public enum ButtonAlias
Touchpad_Touch,
Touchpad_Press,
Application_Menu
public ButtonAlias pointerToggleButton = ButtonAlias.G
public ButtonAlias grabToggleButton = ButtonAlias.T
public ButtonAlias useToggleButton = ButtonAlias.T
public ButtonAlias menuToggleButton = ButtonAlias.Application_M
public int axisFidelity = 1;
public bool triggerPressed =
public bool triggerAxisChanged =
public bool applicationMenuPressed =
public bool touchpadPressed =
public bool touchpadTouched =
public bool touchpadAxisChanged =
public bool gripPressed =
public bool pointerPressed =
public bool grabPressed =
public bool usePressed =
public bool menuPressed =
public event ControllerInteractionEventHandler TriggerP
public event ControllerInteractionEventHandler TriggerR
public event ControllerInteractionEventHandler TriggerAxisC
public event ControllerInteractionEventHandler ApplicationMenuP
public event ControllerInteractionEventHandler ApplicationMenuR
public event ControllerInteractionEventHandler GripP
public event ControllerInteractionEventHandler GripR
public event ControllerInteractionEventHandler TouchpadP
public event ControllerInteractionEventHandler TouchpadR
public event ControllerInteractionEventHandler TouchpadTouchS
public event ControllerInteractionEventHandler TouchpadTouchE
public event ControllerInteractionEventHandler TouchpadAxisC
public event ControllerInteractionEventHandler AliasPointerOn;
public event ControllerInteractionEventHandler AliasPointerO
public event ControllerInteractionEventHandler AliasGrabOn;
public event ControllerInteractionEventHandler AliasGrabO
public event ControllerInteractionEventHandler AliasUseOn;
public event ControllerInteractionEventHandler AliasUseO
public event ControllerInteractionEventHandler AliasMenuOn;
public event ControllerInteractionEventHandler AliasMenuO
private uint controllerI
private SteamVR_TrackedObject trackedC
private SteamVR_Controller.D
private Vector2 touchpadAxis = Vector2.
private Vector2 triggerAxis = Vector2.
public virtual void OnTriggerPressed(ControllerInteractionEventArgs e)
if (TriggerPressed != null)
TriggerPressed(this, e);
public virtual void OnTriggerReleased(ControllerInteractionEventArgs e)
if (TriggerReleased != null)
TriggerReleased(this, e);
public virtual void OnTriggerAxisChanged(ControllerInteractionEventArgs e)
if (TriggerAxisChanged != null)
TriggerAxisChanged(this, e);
public virtual void OnApplicationMenuPressed(ControllerInteractionEventArgs e)
if (ApplicationMenuPressed != null)
ApplicationMenuPressed(this, e);
public virtual void OnApplicationMenuReleased(ControllerInteractionEventArgs e)
if (ApplicationMenuReleased != null)
ApplicationMenuReleased(this, e);
public virtual void OnGripPressed(ControllerInteractionEventArgs e)
if (GripPressed != null)
GripPressed(this, e);
public virtual void OnGripReleased(ControllerInteractionEventArgs e)
if (GripReleased != null)
GripReleased(this, e);
public virtual void OnTouchpadPressed(ControllerInteractionEventArgs e)
if (TouchpadPressed != null)
TouchpadPressed(this, e);
public virtual void OnTouchpadReleased(ControllerInteractionEventArgs e)
if (TouchpadReleased != null)
TouchpadReleased(this, e);
public virtual void OnTouchpadTouchStart(ControllerInteractionEventArgs e)
if (TouchpadTouchStart != null)
TouchpadTouchStart(this, e);
public virtual void OnTouchpadTouchEnd(ControllerInteractionEventArgs e)
if (TouchpadTouchEnd != null)
TouchpadTouchEnd(this, e);
public virtual void OnTouchpadAxisChanged(ControllerInteractionEventArgs e)
if (TouchpadAxisChanged != null)
TouchpadAxisChanged(this, e);
public virtual void OnAliasPointerOn(ControllerInteractionEventArgs e)
if (AliasPointerOn != null)
AliasPointerOn(this, e);
public virtual void OnAliasPointerOff(ControllerInteractionEventArgs e)
if (AliasPointerOff != null)
AliasPointerOff(this, e);
public virtual void OnAliasGrabOn(ControllerInteractionEventArgs e)
if (AliasGrabOn != null)
AliasGrabOn(this, e);
public virtual void OnAliasGrabOff(ControllerInteractionEventArgs e)
if (AliasGrabOff != null)
AliasGrabOff(this, e);
public virtual void OnAliasUseOn(ControllerInteractionEventArgs e)
if (AliasUseOn != null)
AliasUseOn(this, e);
public virtual void OnAliasUseOff(ControllerInteractionEventArgs e)
if (AliasUseOff != null)
AliasUseOff(this, e);
public virtual void OnAliasMenuOn(ControllerInteractionEventArgs e)
if (AliasMenuOn != null)
AliasMenuOn(this, e);
public virtual void OnAliasMenuOff(ControllerInteractionEventArgs e)
if (AliasMenuOff != null)
AliasMenuOff(this, e);
ControllerInteractionEventArgs SetButtonEvent(ref bool buttonBool, bool value, float buttonPressure)
buttonBool =
ControllerInteractionEventA
e.controllerIndex = controllerI
e.buttonPressure = buttonP
e.touchpadAxis = device.GetAxis();
float angle = Mathf.Atan2(e.touchpadAxis.y, e.touchpadAxis.x) * Mathf.Rad2D
angle = 90.0f -
if (angle & 0)
angle &#43;= 360.0f;
e.touchpadAngle =
void Awake()
trackedController = GetComponent&SteamVR_TrackedObject&();
void Start()
controllerIndex = (uint)trackedController.
device = SteamVR_Controller.Input((int)controllerIndex);
void EmitAlias(ButtonAlias type, bool touchDown, float buttonPressure, ref bool buttonBool)
if (pointerToggleButton == type)
if (touchDown)
pointerPressed =
OnAliasPointerOn(SetButtonEvent(ref buttonBool, true, buttonPressure));
pointerPressed =
OnAliasPointerOff(SetButtonEvent(ref buttonBool, false, buttonPressure));
if (grabToggleButton == type)
if (touchDown)
grabPressed =
OnAliasGrabOn(SetButtonEvent(ref buttonBool, true, buttonPressure));
grabPressed =
OnAliasGrabOff(SetButtonEvent(ref buttonBool, false, buttonPressure));
if (useToggleButton == type)
if (touchDown)
usePressed =
OnAliasUseOn(SetButtonEvent(ref buttonBool, true, buttonPressure));
usePressed =
OnAliasUseOff(SetButtonEvent(ref buttonBool, false, buttonPressure));
if (menuToggleButton == type)
if (touchDown)
menuPressed =
OnAliasMenuOn(SetButtonEvent(ref buttonBool, true, buttonPressure));
menuPressed =
OnAliasMenuOff(SetButtonEvent(ref buttonBool, false, buttonPressure));
bool Vector2ShallowEquals(Vector2 vectorA, Vector2 vectorB)
return (vectorA.x.ToString(&F& &#43; axisFidelity) == vectorB.x.ToString(&F& &#43; axisFidelity) &&
vectorA.y.ToString(&F& &#43; axisFidelity) == vectorB.y.ToString(&F& &#43; axisFidelity));
void Update()
controllerIndex = (uint)trackedController.
device = SteamVR_Controller.Input((int)controllerIndex);
Vector2 currentTriggerAxis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger);
Vector2 currentTouchpadAxis = device.GetAxis();
if (Vector2ShallowEquals(triggerAxis, currentTriggerAxis))
triggerAxisChanged =
OnTriggerAxisChanged(SetButtonEvent(ref triggerAxisChanged, true, currentTriggerAxis.x));
if (Vector2ShallowEquals(touchpadAxis, currentTouchpadAxis))
touchpadAxisChanged =
OnTouchpadAxisChanged(SetButtonEvent(ref touchpadTouched, true, 1f));
touchpadAxisChanged =
touchpadAxis = new Vector2(currentTouchpadAxis.x, currentTouchpadAxis.y);
triggerAxis = new Vector2(currentTriggerAxis.x, currentTriggerAxis.y);
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
OnTriggerPressed(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x));
EmitAlias(ButtonAlias.Trigger, true, currentTriggerAxis.x, ref triggerPressed);
else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
OnTriggerReleased(SetButtonEvent(ref triggerPressed, false, 0f));
EmitAlias(ButtonAlias.Trigger, false, 0f, ref triggerPressed);
//ApplicationMenu
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.ApplicationMenu))
OnApplicationMenuPressed(SetButtonEvent(ref applicationMenuPressed, true, 1f));
EmitAlias(ButtonAlias.Application_Menu, true, 1f, ref applicationMenuPressed);
else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.ApplicationMenu))
OnApplicationMenuReleased(SetButtonEvent(ref applicationMenuPressed, false, 0f));
EmitAlias(ButtonAlias.Application_Menu, false, 0f, ref applicationMenuPressed);
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip))
OnGripPressed(SetButtonEvent(ref gripPressed, true, 1f));
EmitAlias(ButtonAlias.Grip, true, 1f, ref gripPressed);
else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Grip))
OnGripReleased(SetButtonEvent(ref gripPressed, false, 0f));
EmitAlias(ButtonAlias.Grip, false, 0f, ref gripPressed);
//Touchpad Pressed
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))
OnTouchpadPressed(SetButtonEvent(ref touchpadPressed, true, 1f));
EmitAlias(ButtonAlias.Touchpad_Press, true, 1f, ref touchpadPressed);
else if (device.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad))
OnTouchpadReleased(SetButtonEvent(ref touchpadPressed, false, 0f));
EmitAlias(ButtonAlias.Touchpad_Press, false, 0f, ref touchpadPressed);
//Touchpad Touched
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))
OnTouchpadTouchStart(SetButtonEvent(ref touchpadTouched, true, 1f));
EmitAlias(ButtonAlias.Touchpad_Touch, true, 1f, ref touchpadTouched);
else if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad))
OnTouchpadTouchEnd(SetButtonEvent(ref touchpadTouched, false, 0f));
EmitAlias(ButtonAlias.Touchpad_Touch, false, 0f, ref touchpadTouched);
  在这个类中我们可以看到,枚举类ButtonAlias里的元素,分别对应HTCVive控制柄上的按钮:
ControllerInteractionEventHandler类型的委托方法有:
接下来,我们来看下,Toolkit具体是怎么自己封装的SteamVR控制柄的事件的。
  在VRTK_ControllerEvents.cs这个脚本的Update()中,我们先找到这样一段代码:
  从这段代码中(代码的意思很简单,我就不说了,具体看下它的逻辑处理),我们可以看到,每帧监听一次SteamVR中的控制柄状态,当监听到状态后,执行一次自己的委托事件(ControllerInteractionEventHandler),并且执行一次EmitAlias(ButtonAlias type, bool touchDown, float buttonPressure, ref bool buttonBool)方法。EmitAlias方法是用来判断并分发事件给AliasXX(oN/oFF)的(就是刚才分割线以下的那些委托方法)。
  至于AliasXX(oN/oFF)这些委托方法怎么用?我们可以先看下这个VRTK_ControllerEvents.cs挂接脚本在Inspector面板中的序列化属性:
  AliasXX(oN/oFF)委托方法对应:
  至于Inspector面板中的其它属性,都没有实际用处,不需要我们去自定义,所以如果不想看到的话,可以自己在脚本中的相应变量上加上[HideInInspector],最后:
  Tollkit对SteamVR的封装逻辑很简单,用这么长的篇幅来说,主要目的还是想自己再仔细研究下,虽然它的逻辑简单,但是我觉的它的代码结构很漂亮。不感兴趣的,可以忽略。至于怎么用,Toolkit也给出了一个挂接脚本,很简单的用法,我挂一下它的代码就行,看完很容易理解:
using UnityEusing System.Cusing VRTK;public class VRTK_ControllerEvents_ListenerExample : MonoBehaviour { // Use this for initialization void Start () {
if (GetComponent&VRTK_ControllerEvents&() == null)
Debug.LogError(&VRTK_ControllerEvents_ListenerExample is required to be attached to a SteamVR Controller that has the VRTK_ControllerEvents script attached to it&);
//Setup controller event listeners
GetComponent&VRTK_ControllerEvents&().TriggerPressed &#43;= new ControllerInteractionEventHandler(DoTriggerPressed);
GetComponent&VRTK_ControllerEvents&().TriggerReleased &#43;= new ControllerInteractionEventHandler(DoTriggerReleased);
GetComponent&VRTK_ControllerEvents&().TriggerAxisChanged &#43;= new ControllerInteractionEventHandler(DoTriggerAxisChanged);
GetComponent&VRTK_ControllerEvents&().ApplicationMenuPressed &#43;= new ControllerInteractionEventHandler(DoApplicationMenuPressed);
GetComponent&VRTK_ControllerEvents&().ApplicationMenuReleased &#43;= new ControllerInteractionEventHandler(DoApplicationMenuReleased);
GetComponent&VRTK_ControllerEvents&().GripPressed &#43;= new ControllerInteractionEventHandler(DoGripPressed);
GetComponent&VRTK_ControllerEvents&().GripReleased &#43;= new ControllerInteractionEventHandler(DoGripReleased);
GetComponent&VRTK_ControllerEvents&().TouchpadPressed &#43;= new ControllerInteractionEventHandler(DoTouchpadPressed);
GetComponent&VRTK_ControllerEvents&().TouchpadReleased &#43;= new ControllerInteractionEventHandler(DoTouchpadReleased);
GetComponent&VRTK_ControllerEvents&().TouchpadTouchStart &#43;= new ControllerInteractionEventHandler(DoTouchpadTouchStart);
GetComponent&VRTK_ControllerEvents&().TouchpadTouchEnd &#43;= new ControllerInteractionEventHandler(DoTouchpadTouchEnd);
GetComponent&VRTK_ControllerEvents&().TouchpadAxisChanged &#43;= new ControllerInteractionEventHandler(DoTouchpadAxisChanged);
void DebugLogger(uint index, string button, string action, ControllerInteractionEventArgs e)
Debug.Log(&Controller on index '& &#43; index &#43; &' & &#43; button &#43; & has been & &#43; action
&#43; & with a pressure of & &#43; e.buttonPressure &#43; & / trackpad axis at: & &#43; e.touchpadAxis &#43; & (& &#43; e.touchpadAngle &#43; & degrees)&);
void DoTriggerPressed(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TRIGGER&, &pressed down&, e);
void DoTriggerReleased(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TRIGGER&, &released&, e);
void DoTriggerAxisChanged(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TRIGGER&, &axis changed&, e);
void DoApplicationMenuPressed(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &APPLICATION MENU&, &pressed down&, e);
void DoApplicationMenuReleased(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &APPLICATION MENU&, &released&, e);
void DoGripPressed(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &GRIP&, &pressed down&, e);
void DoGripReleased(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &GRIP&, &released&, e);
void DoTouchpadPressed(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TOUCHPAD&, &pressed down&, e);
void DoTouchpadReleased(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TOUCHPAD&, &released&, e);
void DoTouchpadTouchStart(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TOUCHPAD&, &touched&, e);
void DoTouchpadTouchEnd(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TOUCHPAD&, &untouched&, e);
void DoTouchpadAxisChanged(object sender, ControllerInteractionEventArgs e)
DebugLogger(e.controllerIndex, &TOUCHPAD&, &axis changed&, e);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1772次
排名:千里之外

我要回帖

更多关于 steamvr测试 的文章

 

随机推荐