如何在VR场景中位移传感器smwei与行走Unity VRTK

柚子VR-VR虚拟现实门户网站,VR媒体平台。
当前您在:
> 内容正文
unity手柄事件(VRTK_ControllerEvents)参数
时间: 16:17
编辑: 时遇
来源:柚子VR
  Controller Events 脚本用于统一处理Vive手柄发送的事件.  Controller Events 脚本挂载在[CameraRig] 预置件下的Controller 子对象上,为手柄上每个按钮的触发提供事件监听 (包括menu按钮).  当手柄上某个按钮被按下, 脚本会发送一个事件, 通知其他脚本这个点击事件,而具体的点击逻辑并不需要写在Controller Events脚本里面. 当一个按钮被释放, 脚本同样会发送一个事件通知其他脚本这个按钮被释放了.  这个脚本也有各个按钮相应的public boolean属性以便其他脚本获取到所需按钮的当前状态,例如是否释放,是否点击等.Inspector可见参数  unity手柄事件(VRTK_ControllerEvents),在unity中,可以通过下拉列表,指定这些行为的对应按钮是什么?&·&Pointer Toggle Button: 这个按钮用于控制一束激光指示线开/关.&·&Pointer Set Button: 这个按钮用于设置指示线的目标标记.&·&Grab Toggle Button: 这个按钮用于控制抓取游戏中的物体.&·&Use Toggle Button: 这个按钮用于使用游戏中的物体.&·&UI Click Button: 这个按钮用于点击UI元素.&·&Menu Toggle Button:这个按钮用于点击弹出游戏内置按钮.&·&Axis Fidelity: 坐标变化的精度, 默认为1. 大于2的数字将会导致过于灵敏的结果.变量&·&public bool triggerPressed - 当trigger被扣下一半左右时为真.&·&public bool triggerTouched - 当trigger被扣下一点点时为真.&·&public bool triggerHairlinePressed - 当trigger比任何之前扣下的程度多时为真.&·&public bool triggerClicked - 当trigger完全扣下时为真.&·&public bool triggerAxisChanged - 当trigger位置改变时为真.&·&public bool applicationMenuPressed - 当application menu被按下时为真.&·&public bool touchpadPressed - 当touchpad被按下时为真.&·&public bool touchpadTouched - 当touchpad被触碰时为真.&·&public bool touchpadAxisChanged - 当touchpad触碰位置改变时为真.&·&public bool gripPressed - 当grip被按下时为真.&·&public bool pointerPressed - 当别名为pointer的按钮被按下时为真.&·&public bool grabPressed - 当别名为grab的按钮被按下时为真.&·&public bool usePressed - 当别名为use的按钮被按下时为真.&·&public bool uiClickPressed - 当别名为UI click的按钮被按下时为真.&·&public bool menuPressed - 当别名为menu的按钮被按下时为真.事件&·&TriggerPressed - 当trigger被扣下一半左右时发送事件.&·&TriggerReleased - 当Trigger从扣下一半的状态释放后发送事件.&·&TriggerTouchStart - 当trigger被扣下一点点时发送事件.&·&TriggerTouchEnd - 当trigger完全没有被扣下时发送事件.&·&TriggerHairlineStart - 当trigger扣下的程度超过了当前的hairline阈值时发送事件.&·&TriggerHairlineEnd - 当tringger释放程度超过了当前的hairline阈值时发送事件.&·&TriggerClicked - 当trigger在clicked之前扣下的过程中发送事件.&·&TriggerUnclicked - 当trigger不再一直处于clicked状态时发送事件.&·&TriggerAxisChanged - 当trigger扣下的量发生变化时发送事件.&·&ApplicationMenuPressed - 当application menu被按下时发送事件.&·&ApplicationMenuReleased - 当application menu被释放时发送事件.&·&GripPressed - 当grip被按下时发送事件.&·&GripReleased - 当grip被释放时发送事件.&·&TouchpadPressed - 当touchpad被按下的时候发送事件(比触摸的按压程度大).&·&TouchpadReleased - 当touchpad从被按下(非触碰)的状态下释放时发送事件.&·&TouchpadTouchStart - 当touchpad被触摸时发送事件 (不是点击或者摁下).&·&TouchpadTouchEnd - 当touchpad不再被触摸时发送事件.&·&TouchpadAxisChanged - 当touchpad被触摸的点改变时发送事件.&·&AliasPointerOn - 当pointer toggle(别名)被按下的时候发送事件.&·&AliasPointerOff - 当pointer toggle(别名)被释放的时候发送事件.&·&AliasPointerSet - 当pointer set(别名)被释放时发送事件.&·&AliasGrabOn - 当grab toggle(别名)被按下的时候发送事件.&·&AliasGrabOff - 当grab toggle(别名)被释放的时候发送事件.&·&AliasUseOn - 当use toggle(别名)被按下的时候发送事件.&·&AliasUseOff - 当use toggle(别名)被释放时发送事件.&·&AliasMenuOn - 当menu toggle(别名)被按下时发送事件.&·&AliasMenuOff - 当menu toggle(别名)被释放时发送事件.&·&AliasUIClickOn - 当UI click(别名)被按下时发送事件.&·&AliasUIClickOff - 当UI click(别名)被释放时发送事件.  事件和bool状态变量有着对应的关系,通常一个bool状态变量会对应至少两个按钮事件事件装载参数1234567public struct ControllerInteractionEventArgs{&&&&public uint controllerI&&&&public float buttonP&&&&public Vector2 touchpadA&&&&public float touchpadA}&·&uint controllerIndex - 当前使用设备的索引.&·&float buttonPressure - 按钮的按压数值. 0f 到 1f.&·&Vector2 touchpadAxis - touchpad被触摸的坐标. (0,0) 到 (1,1).&·&float touchpadAngle - touchpad触摸时滑动的角度, top为0, bottom为180,以此类推其他 . 0f 到 360f.委托类型1public delegate void ControllerInteractionEventHandler(object sender, ControllerInteractionEventArgs e);  声明一个委托类型,参数为object和ControllerInteractionEventArgs,绑定事件时一定要传入这两个参数,按钮被按下时会通过SetButtonEvent()方法来给ControllerInteractionEventArgs e分配值.按钮别名123456789101112public enum ButtonAlias&{&&&&&Trigger_Hairline,&&&&&Trigger_Touch,&&&&&Trigger_Press,&&&&&Trigger_Click,&&&&&Grip,&&&&&Touchpad_Touch,&&&&&Touchpad_Press,&&&&&Application_Menu,&&&&&Undefined&}  这个工具类给Vive手柄一些常用的操作取一些别名,和实际的按钮建立映射,例如:1public ButtonAlias menuToggleButton = ButtonAlias.Application_M  这个menuToggleButton与SteamVR中的1SteamVR_Controller.ButtonMask.ApplicationMenu  对应,当这个按钮被按下时,别名按钮对应的事件(如果有绑定)也会发送和SteamVR相关的全局变量12345678910private uint controllerIprivate SteamVR_TrackedObject trackedCprivate SteamVR_Controller.Dprivate Vector2 touchpadAxis = Vector2.private Vector2 triggerAxis = Vector2.private float hairTriggerDprivate Vector3 controllerVelocity = Vector3.private Vector3 controllerAngularVelocity = Vector3.&·&controllerIndex - 手柄的索引值,通过trackedController.index获取&·&trackedController - gameobject绑定的SteamVR_TrackedObject脚本&·&device - 设备类,通过此类获取实际中手柄的各种数据&·&touchpadAxis - 全局变量,touchpad的坐标&·&triggerAxis - 全局变量,trigger的坐标&·&hairTriggerDelta -&·&controllerVelocity - 手柄运动的速度&·&controllerAngularVelocity - 手柄旋转的角速度事件发送方法  以OnTriggerPressed方法为例,其他都和这个差不多1234567public virtual void OnTriggerPressed(ControllerInteractionEventArgs e){&&&&if (TriggerPressed != null)&&&&{&&&&&&&&TriggerPressed(this, e);//发送事件,通知绑定此事件的脚本,执行具体的逻辑,但是此处是真正最后调用的地方&&&&}}装载参数12345678910private ControllerInteractionEventArgs SetButtonEvent(ref bool buttonBool, bool value, float buttonPressure){&&&&buttonBool =&&&&ControllerInteractionEventA&&&&e.controllerIndex = controllerI&&&&e.buttonPressure = buttonP&&&&e.touchpadAxis = device.GetAxis();//调用SteamVR API获取当前的touchpad二维坐标&&&&e.touchpadAngle = CalculateTouchpadAxisAngle(e.touchpadAxis);//计算二维坐标在圆形表盘上对应的角度&&&&}  通过传入ref bool buttonBool,可以在对ControllerInteractionEventArgs进行装填的同时,把事件对应的按钮bool状态进行更新,  例如TriggerPressed和TriggerReleased事件对应的按钮bool状态是triggerPressed,当发送TriggerPressed事件时要同时更新triggerPressed为true;发送TriggerReleased事件时要同时更新triggerPressed为false初始化12345678910111213141516private void Awake(){&&&&trackedController = GetComponent();&&&&gameObject.layer = LayerMask.NameToLayer(&Ignore Raycast&);}private void Start(){&&&&//获取当前脚本attach的Controller的index&&&&controllerIndex = (uint)trackedController.&&&&if (controllerIndex & uint.MaxValue)&&&&{&&&&&&&&//获取设备&&&&&&&&device = SteamVR_Controller.Input((int)controllerIndex);&&&&}}  一般头显对应的index为0,两个手柄分别为0和1别名按钮事件发送12345678910111213141516private void EmitAlias(ButtonAlias type, bool touchDown, float buttonPressure, ref bool buttonBool)…&&&&&&&&if (pointerToggleButton == type)&&&&&&&&{&&&&&&&&&&&&if (touchDown)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&pointerPressed =&&&&&&&&&&&&&&&&OnAliasPointerOn(SetButtonEvent(ref buttonBool, true, buttonPressure));&&&&&&&&&&&&}&&&&&&&&&&&&else&&&&&&&&&&&&{&&&&&&&&&&&&&&&&pointerPressed =&&&&&&&&&&&&&&&&OnAliasPointerOff(SetButtonEvent(ref buttonBool, false, buttonPressure));&&&&&&&&&&&&}&&&&&&&&}…  根据type判断是哪个别名按钮,最后一个参数buttonBool对应的是非别名的按钮bool状态,例如这个pointerToggleButton,发送事件时要把touchpadPressed状态更新,而更新为true还是false要根据touchDown的值来判断,上面的OnAliasPointerOn等方法和OnTriggerPressed  值得注意的是,不同的别名对应的可能是相同的按钮,例如pointerToggleButton和pointerSetButton都是ButtonAlias.Touchpad_Press.禁用事件123456789101112131415161718192021222324252627282930313233343536private void OnDisable(){&&&&//在0.1s内调用DisableEvents(),禁用所有事件发送&&&&Invoke(&DisableEvents&, 0.1f);}////// 禁用,还原,但是保存touchpad和trigger的坐标等///private void DisableEvents(){&&&&if (triggerPressed)&&&&{&&&&&&&&OnTriggerReleased(SetButtonEvent(ref triggerPressed, false, 0f));&&&&&&&&EmitAlias(ButtonAlias.Trigger_Press, false, 0f, ref triggerPressed);&&&&}&&&&...&&&&triggerAxisChanged =&&&&touchpadAxisChanged =&&&&controllerIndex = (uint)trackedController.&&&&if (controllerIndex & uint.MaxValue)&&&&{&&&&&&&&device = SteamVR_Controller.Input((int)controllerIndex);&&&&&&&&Vector2 currentTriggerAxis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger);&&&&&&&&Vector2 currentTouchpadAxis = device.GetAxis();&&&&&&&&// 保存当前的touchpad和trigger的设置.&&&&&&&&touchpadAxis = new Vector2(currentTouchpadAxis.x, currentTouchpadAxis.y);&&&&&&&&triggerAxis = new Vector2(currentTriggerAxis.x, currentTriggerAxis.y);&&&&&&&&hairTriggerDelta = device.hairTriggerD&&&&}}  这个方法应该就是将所有事件对应的按钮bool状态置为false,同时保存touchpad和trigger上的坐标信息,但是为什么要重新获取一次device呢?Update()方法123456789101112131415161718192021222324252627282930313233private void Update(){&&&&controllerIndex = (uint)trackedController.&&&&//Only continue if the controller index has been set to a sensible number&&&&//SteamVR 在未找到Controller时会把index置为uint最大的值&&&&if (controllerIndex &= uint.MaxValue)&&&&{&&&&&&&&&&&&}&&&&device = SteamVR_Controller.Input((int)controllerIndex);&&&&Vector2 currentTriggerAxis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger);&&&&Vector2 currentTouchpadAxis = device.GetAxis();&&&&//Trigger Pressed&&&&if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))&&&&{&&&&&&&&//发送事件,设triggerPressed为true,同时发送Trigger_Press对应的别名按钮事件&&&&&&&&OnTriggerPressed(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x));&&&&&&&&EmitAlias(ButtonAlias.Trigger_Press, true, currentTriggerAxis.x, ref triggerPressed);&&&&}&&&&else if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))&&&&{&&&&&&&&OnTriggerReleased(SetButtonEvent(ref triggerPressed, false, 0f));&&&&&&&&EmitAlias(ButtonAlias.Trigger_Press, false, 0f, ref triggerPressed);&&&&}&&&&...&&&&// 保存当前trigger和touchpad状态.&&&&touchpadAxis = new Vector2(currentTouchpadAxis.x, currentTouchpadAxis.y);&&&&triggerAxis = new Vector2(currentTriggerAxis.x, currentTriggerAxis.y);&&&&hairTriggerDelta = device.hairTriggerD}使用实例  例如在VRTK_ControllerEvents_ListenerExample中123456GetComponent().TriggerPressed += new ControllerInteractionEventHandler(DoTriggerPressed);private void DoTriggerPressed(object sender, ControllerInteractionEventArgs e){&&&&DebugLogger(e.controllerIndex, &TRIGGER&, &pressed&, e);}  获取到当前Controller绑定的VRTK_ControllerEvents脚本,为它的TriggerPressed绑定DoTriggerPressed方法,在VRTK_ControllerEvents脚本中,每一帧会检测trigger是否被按下,如果按下,则发送事件1OnTriggerPressed(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x));  然后在OnTriggerPressed方法里执行TriggerPressed(this, e);  此时DoTriggerPressed(this,e)被真正调用,而example脚本中无需在update中写代码,只需要在初始化的时候绑定事件就可以了.
关于我们进一步了解我们?
网站地图快速找到你想要的
微信扫一扫关注我们
柚子VR-浙ICP备号-1简单激光指针(VRTK_&SimplePointer)
简单指针(Simple Pointer)脚本从控制器尾部发出一个有色光束来模拟激光束。这在场景中指向对象很有用,它能判断所指向的对象以及对象距控制器发出光束位置的距离。
激光束默认按下控制器的抓握键(Grip)来激活。因为所侦听的事件是AliasPointer别名事件,所以这个指针开关按钮可以通过在 VRTK_ControllerEvents脚本参数里来改变 pointerToggleButton来选择设置。
简单指针脚本(VRTK_ SimplePointer)添加到[CameraRig] 预制里的控制器对象上,同时添加需要VRTK_ControllerEvents脚本来监听启用和禁用光束的控制器按钮事件。
下面是可用脚本参数:
&&Enable Teleport(启用传送):如果勾选了,在目标设置事件中的teleport标志位就设为true,所以传送脚本就知道是否要行动到新的目标。如果这个选项没有勾选的话,控制器光束启动但是不会触发位移。
&&Point Hit Color(指针碰撞颜色):当光束和一个有效目标碰撞的颜色。每个控制器可以有不同的颜色设置。
&&Pointer Miss Color(指针无碰撞颜色):当光束没有命中有效目标时的颜色。每个控制器可以有不同的颜色设置。
&&Show Play Area Cursor(显示游玩区光标):如果这个启动,游玩区界限就会在光束指针的顶端显示出来,颜色和当前指针颜色相同。
&&Play Area Cursor Dimensions(游玩去光标尺寸):决定游玩区光标和碰撞的尺寸。如果值为零,Play Area Cursor 的尺寸将根据Play Area空间进行校正。
&&Handle Play Area Cursor Collisions(处理游玩区光标碰撞):如果勾选,当游玩区光标和其他物体发生碰撞时,指针颜色就会变成Pointer Miss Color的颜色且WorldPointerDestinationSet 事件将不会被触发,这将防止传送到游玩区会发生碰撞的区域。
&&Beam Always On(光束总是开启):如果这个勾选,光束指针总是可见,但是设置目标点事件仍然只会在所指定按钮松开时发出。
&&Pointer Thickness(指针光束厚度):光束长宽也可以在脚本里设置以及能够开关显示在光柱最后的球形光柱顶端(表示光标)。
&&Pointer Length(指针光束长度):在停止前光束投射的距离。
&&Show Pointer Tip(显示指针顶端):切换是否光标显示在光束指针的尾部。
简单指针对象扩展自VRTK_WorldPointer 抽象类并因此发出相同的事件和有效数据。
VRTK_SimplePointer脚本的例子可以在SteamVR_Unity_Toolkit/Examples/003_Controller_SimplePointer场景中看到并且事件用法和监听的脚本例子可以看SteamVR_Unity_Toolkit/Examples/Resources/Scripts/VRTK_ControllerPointerEvents_ListenerExample.cs脚本。
贝塞尔曲线激光指针(VRTK_BezierPointer)
贝塞尔指针从控制器末端发出一个曲线(由游戏对象组构而成)到(任何高度的)地面上一点。这比简单激光指针要有用的多,因为终点能够弯曲到玩家看不见的对象顶部,所以就可以传送到各种高度的对象上。
激光束默认按控制器上的抓握键Grip来激活。事件侦听AliasPointer别名事件,所以Pointer Toggle button可以通过在VRTK_ControllerEvents 脚本中改变Pointer Toggle button来进行选择设置。
贝塞尔指针脚本被添加到[CameraRig]预制里的控制器对象上,控制器对象同时需要添加VRTK_ControllerEvents脚本用来监听控制器按钮开关光束的事件。
可用脚本参数如下:
&&Enable Teleport(启用传送):如果勾选了,在目标设置事件中的teleport标志位就设为true,所以传送脚本就知道是否要行动到新的目标。如果这个选项没有勾选的话,控制器光束启动但是不会触发位移。
&&Point Hit Color(指针碰撞颜色):当光束和一个有效目标碰撞的颜色。每个控制器可以有不同的颜色设置。
&&Pointer Miss Color(指针无碰撞颜色):当光束没有命中有效目标时的颜色。每个控制器可以有不同的颜色设置。
&&Show Play Area Cursor(显示游玩区光标):如果这个启动,游玩区界限就会在光束指针的顶端显示出来,颜色和当前指针颜色相同。
&&Play Area Cursor Dimensions(游玩去光标尺寸):决定游玩区光标和碰撞的尺寸。如果值为零,Play Area Cursor 的尺寸将根据Play Area空间进行校正。
&&Handle Play Area Cursor Collisions(处理游玩区光标碰撞):如果勾选,当游玩区光标和其他物体发生碰撞时,指针颜色就会变成Pointer Miss Color的颜色且WorldPointerDestinationSet 事件将不会被触发,这将防止传送到游玩区会发生碰撞的区域。
&&Beam Always On(光束总是开启):如果这个勾选,光束指针总是可见,但是设置目标点事件仍然只会在所指定按钮松开时发出。
&&Activate Delay(激活间隔):能够再次激活指针光束的延迟时间秒数。用来防止持续传送。
&&Pointer Length(指针光束长度):在停止前光束投射的距离。
&&Pointer Density(指针密度):贝塞尔曲线光束渲染的物体个数。这里数值太高将很可能会因为大量渲染对象来对游戏性能有负面影响。
&&Show Pointer Cursor(显示指针光标):在光束终点位置的地面显示光标。用来看光束终点位置的高度很有用,它可以通过切换这个来关闭。
&&Pointer Cursor Radius(指针光标半径):地面指针光标的尺寸,这个值也会影响贝塞尔曲线光束里的对象的尺寸。半径越大,对象尺寸越大。
&&Beam Curve Offset(光束曲线偏移):&投射光束时应用的高度偏移量,就算在光束径直指向时也能产生一个光滑的曲线。
&&Custom Pointer Tracer(自定义指针轨迹):&可以在这里设置一个自定义的游戏对象用来代替光束轨迹的默认球体。自定义游戏对象将和控制器的旋转想匹配。
&&Custom Pointer Cursor(自定义指针光标):&&可以在这里设置一个自定义的游戏对象用来代替指针光标的默认平柱体。
贝塞尔指针对象扩展自VRTK_WorldPointer 抽象类并因此发出相同的事件和有效数据。
VRTK_BezierPointer脚本的例子参见SteamVR_Unity_Toolkit/Examples/009_Controller_BezierPointer场景,它被连同Height Adjust Teleporter脚本一起使用,来显示怎样可以不需要看到对象的顶部就能使用曲线指针来传送到不同高度的对象上。
另一个例子可以参见SteamVR_Unity_Toolkit/Examples/012_Controller_PointerWithAreaCollision场景,这里演示了一个开启了游玩区光标和碰撞检测的贝塞尔指针怎样被用来穿过游戏区域,但是不允许传送到墙壁或者其他对象的区域而导致游玩区让玩家穿进墙壁。
贝塞尔曲线生成的代码是另一个脚本,位置在SteamVR_Unity_Toolkit/Scripts/Helper/CurveGenerator.cs,这基本是受Catlike Coding的教程和代码的启发()。
基础传送器(VRTK_BasicTeleport)
基础传送器更新[CameraRig]在游戏世界中的x和z位置到由WorldPointerDestinationSet事件设置定位的世界指针顶端的位置。y位置从不改变,所以基础传送器不能用来上下对象而只能水平移动。
基础传送器脚本被添加到[CameraRig] 预制下面并需要一个实现了WorldPointer 的脚本添加到另一个游戏对象上(如VRTK_SimplePointer添加到控制器对象上)。
可用脚本参数如下:
&&Blink Transition Speed(眨眼淡入淡出速度):可以在基础传送脚本中改变眨眼渐变速度来提供一个自定义的传送体验。速度设置为0意味着没有渐变眨眼特效呈现。渐变通过 SteamVR Unity 插件脚本里的SteamVR_Fade.cs脚本实现。
&&Distance Blink Delay(距离眨眼延时):&范围从0到32,这个值决定了基于被传送距离的眨眼过渡保持黑屏的时长。值为0时,任何传送距离都不会延长传送的眨眼过渡,值为32时,就算距离初始点很近的被传送距离都会延长传送的眨眼过渡。这可以被用来模拟用户传送更远的距离花费更长时间。值为16对用户来说就刚好。
&&Headset Position Compensation(头盔位置补偿):&如果勾选,传送坐标将会式游玩区内头盔的位置。如果没有勾选,传送坐标将总是游玩区中间的位置,就算头盔位置不在游玩区中间也式如此。
&&Ignore Target With Tag Or Class(忽略带有标签或脚本的目标):&一个指定对象标签或者对象上添加的脚本名字的字符串,通知传送器这种目标点应该被忽略,所以用户就不能传送到这些位置上。同时也确保指针颜色被设为丢失目标点颜色。
VRTK_BasicTeleport 脚本的例子可以参见SteamVR_Unity_Toolkit/Examples/004_CameraRig_BasicTeleport场景。这个场景使用控制器上的VRTK_SimplePointer 脚本在按下grip按钮时初始化一个激光指针,松开Grip按钮时激光指针失效,然后玩家传送到激光指针顶端位置。
可调节高度的传送器(VRTK_HeightAdjustTeleport)
高度调整传送器继承自基础传送器,它允许根据传送位置是否在其他对象顶部来让[CameraRig]改变y位置。
和基础传送器一样,高度调整传送器被添加到[CameraRig]预制并需要一个可用的世界指针。
可用脚本参数如下:
&&Blink Transition Speed(眨眼淡入淡出速度):可以在基础传送脚本中改变眨眼渐变速度来提供一个自定义的传送体验。速度设置为0意味着没有渐变眨眼特效呈现。渐变通过 SteamVR Unity 插件脚本里的SteamVR_Fade.cs脚本实现。
&&Distance Blink Delay(距离眨眼延时):&范围从0到32,这个值决定了基于被传送距离的眨眼过渡保持黑屏的时长。值为0时,任何传送距离都不会延长传送的眨眼过渡,值为32时,就算距离初始点很近的被传送距离都会延长传送的眨眼过渡。这可以被用来模拟用户传送更远的距离花费更长时间。值为16对用户来说就刚好。
&&Headset Position Compensation(头盔位置补偿):&如果勾选,传送坐标将会式游玩区内头盔的位置。如果没有勾选,传送坐标将总是游玩区中间的位置,就算头盔位置不在游玩区中间也式如此。
&&Ignore Target With Tag Or Class(忽略带有标签或脚本的目标):&一个指定对象标签或者对象上添加的脚本名字的字符串,通知传送器这种目标点应该被忽略,所以用户就不能传送到这些位置上。同时也确保指针颜色被设为丢失目标点颜色。
&&Play Space Falling(游玩区坠落):检查是否玩家是否走出对象,即所在游玩区的位置不在对象上,然后就会自动传送到最近的地面上。
反过来说Play Space Falling 选项是在玩家头盔在一个对象上方时会自动传送到一个对象的顶部,这一点在模拟爬梯子时很有用,不需要使用指针光束定位。如果这个选项关闭,玩家就能在他们所站在的对象的同样y高度的空中行走(也就是有一部分游玩区在对象外部)。
VRTK_HeightAdjustTeleport 脚本的例子参见SteamVR_Unity_Toolkit/Examples/007_CameraRig_HeightAdjustTeleport场景。场景有许多不同高度对象,玩家可在来回走或者使用激光束爬到它们顶部。
另一个例子参见SteamVR_Unity_Toolkit/Examples/010_CameraRig_TerrainTeleporting场景,展示了玩家也能够在地形碰撞器上传送。还有个例子SteamVR_Unity_Toolkit/Examples/020_CameraRig_MeshTeleporting场景中,显示玩家在网格碰撞器上传送。
头盔碰撞淡出(VRTK_HeadsetCollisionFade)
头盔碰撞淡出的目的是为了检测用户的VR头盔何时碰撞到其他游戏对象并淡出屏幕到一个单色。这是为了处理玩家把头放进一个游戏对象里看到对象内部的裁剪,这不是我们所期望的。
之所以这么做,是因为如果玩家把头放到不该放的地方就会淡出到一个颜色(如黑色),这就让玩家意识到他们做错了什么,然后可能自然的就会后退。
如果头盔正在碰撞,那么传送行为就被禁用来防止穿插穿墙的作弊。
使用Unity 5.3及之前版本,头盔碰撞淡出脚本添加到[CameraRig] 预制的Camera(head)对象上。
使用Unity 5.4及之后版本,头盔碰撞淡出脚本添加到[CameraRig] 预制下的Camera (head)里的Camera(eye)对象上。
可用脚本参数如下:
&&Blink Transition Speed(眨眼淡入淡出速度):碰撞时淡入淡出速度。
&&Fade Color(淡出颜色):头盔碰撞时淡出颜色。
发出事件如下:
&&HeadsetCollisionDetect:&当用户头盔碰到其他游戏对象时发出。
&&HeadsetCollisionEnded:当用户头盔停止碰撞游戏对象时发出。
发出事件的有效载体内容包括:
&&collider:&头盔所碰撞的游戏对象的碰撞器。
&&currentTransform:&当前头盔碰撞淡入淡出脚本所添加到的对象(相机)的Transform。
VRTK_HeadsetCollisionFade 脚本例子参见SteamVR_Unity_Toolkit/Examples/011_Camera_HeadSetCollisionFading场景。场景在游玩区周围有可碰撞的墙壁,如果玩家把头放进墙壁,头盔就将渐变成黑色。
玩家呈现(VRTK_PlayerPresence)
VR用户在游戏呈现中有身体这一概念,它通过在用户站立在游玩区中的位置添加碰撞和刚体来实现。身体的碰撞和刚体将防止用户能狗穿过墙壁或者和其他可碰撞对象穿插。碰撞体的高度由用户头盔所在高度决定,如果用户下蹲,碰撞体同样收缩,这意味着可能在低的空间去下蹲和爬行通过。
可用脚本参数如下:
&&Headset Y Offset(头盔y偏移):为用户创建的盒型碰撞体的高度由用户头盔位置设置。如果需要碰撞体小一点来让游玩区和头盔之间留有空间的话,这个值将降低生成的盒型碰撞体的高度。
&&Ignore Grabbed Collisions(忽略抓取碰撞):如果勾选,任何被控制器抓取的物品都不会和游玩区的盒碰撞体及刚体发生碰撞。这在用户需要抓取和挥动对象时是很有用的,因为如果碰撞体激活,这些抓取的东西就会被游玩区的碰撞体弹开。
VRTK_PlayerPresence&脚本例子可参见SteamVR_Unity_Toolkit/Examples/017_CameraRig_TouchpadWalking场景。场景有很多墙体和斜坡,用户可以用触摸板来四处行走,但是不能穿过这些对象,因为它们是可碰撞的并且刚体物理将不允许发生穿叉。
触摸板移动&(VRTK_TouchpadWalking)
通过手指在触摸板上滑动来实现用这个脚本让游玩区在游戏世界中能够移动。TouchpadWalking脚本用在[CameraRig]预制上,并且在用户位置添加一个刚体和盒型碰撞来防止他们穿过其他带碰撞的游戏对象。
如果Headset Collision Fade脚本已经被添加到相机预制上,如果用户试着和一个对象发生碰撞,那么他的位置就会被重置为最近的正常的位置。这可能发生在用户穿过需要躬身的区域中途站了起来和顶部发生了碰撞。与其允许用户这样做而引起碰撞,倒不如直接移动回到一个正常的位置。这确实破坏了沉浸感,但用户正在做的事情也是不自然的。
可用脚本参数如下:
&&Left Controller:如果勾选,左控制器的触摸板就能移动游玩区。在运行时可以被切换。
&&Right Controller:如果勾选,右控制器的触摸板就能移动游玩区。在运行时可以被切换。
&&Max Walk Speed:当触摸板被触摸到轴的极限时游玩区所能达到的最大移动速度。触摸板距离中心越近的位置被触摸,移动速度就越慢。
&&Deceleration(减速度):当用户不再触摸到触摸板时游玩区从减速到完全停止的速度。这种减速度效果可以减缓可能遭受的移动恶心。
VRTK_TouchpadWalking&脚本的例子参见SteamVR_Unity_Toolkit/Examples/017_CameraRig_TouchpadWalking场景。场景中有很多墙壁和梯子,用户可以用触摸板来移动。还有个区域只有用户蹲下才能穿过。在俯身区域挺起身体将导致用户闪回他们最近的正常位置。
VRTK_RoomExtender(游玩区空间扩展)
这个脚本允许游玩区跟随玩家移动。CameraRig 只在达到定义的圈的边缘才会移动。目的是为了创造一个虚拟的更大的游玩区。测试这个脚本的demo场景为028_CameraRig_RoomExtender。
把脚本添加到CameraRig来使用。
可用脚本参数如下:
&&Additional Movement Multiplier(额外移动乘数):&圈边缘的移动放大因数。0就是不移动CameraRig。值越高模拟的游玩区域就越大,但是也可能就越不令人舒适。
&&Head Zone Radius(头部空间半径):游玩区不会发生移动的圆圈尺寸,一切都正常的。如果值太低,在蹲下时就会感到不舒服。
&&Debug Transform(调试Transform):&这个transform让玩家周围的CameraRig不移动圆圈显示出来。在demo场景里就是一个在地板上的柱体。记得关闭碰撞。
阅读(...) 评论()

我要回帖

更多关于 位移电流 的文章

 

随机推荐