Untiy:2018、2019都能满足
VRTK:VRTK (3.3.0)并不支持 SteamVR 2.0。Steam商店即可下载
SteamVR:下载v1.2.3
导入上述检查是否兼容,是否报错。
只要SteamVR不出错误就可以
监听VRTK_ControllerEvents输入事件
找到controlloer events,在这里找到事件。这里的事件并不完全是htc的事件。
示例事件受枚举影响
None 不显示Debug
ALL 显示所有
ButtonOnly 只显示按钮
AxisOnly 只显示轴相关的
Custom 自定义类型
Debug显示的是哪只手(VRTK_ControllerRenfernce.GetRealIndex(e.controllerReference))获取哪一只是手柄
以及按下哪一个按钮,按下的事件,touchadAxis轴值,角度,都可以获取。
首先删除MainCamera
创建VRTK_SDKManager挂载VRTK_SDKManager
创建空物体ControllerScripts
运行检查有无问题。
创建空物体命名为ExampleScripts
运行检测输入有没有问题。
SDK_SetUp要隐藏!!!
通过Example可以看到关于按键判断,相关的按键的名称和时机触发。
TriggerPressed - 当trigger被扣下一半左右时发送事件.
TriggerReleased - 当Trigger从扣下一半的状态释放后发送事件.
TriggerTouchStart - 当trigger被扣下一点点时发送事件.
TriggerTouchEnd - 当trigger完全没有被扣下时发送事件.
TriggerHairlineStart - 当trigger扣下的程度超过了当前的hairline阈值时发送事件.
TriggerHairlineEnd - 当tringger释放程度超过了当前的hairline阈值时发送事件.
TriggerClicked - 当trigger在扣下的过程中发送事件.比TriggerPressed触发稍晚
TriggerUnclicked - 当trigger不再处于clicked状态时发送事件.
TriggerAxisChanged - 当trigger扣下的量发生变化时发送事件.
TouchpadTouchStart - 当touchpad被触摸时发送事件 (不是点击或者摁下).
TouchpadTouchEnd - 当touchpad不再被触摸时发送事件.
TouchpadPressed - 当touchpad被按下的时候发送事件(在触摸的基础上,需要比触摸的按压程度大).
TouchpadReleased - 当touchpad从被按下(非触碰)的状态下释放时发送事件.
TouchpadAxisChanged - 当touchpad被触摸的点改变时发送事件.
排序(执行顺序)
效果:手柄发射出直射线带有颜色,并且选中可交互的物体射线会变颜色。
在LeftController上挂在两个组件。VRTK_Pointer和VRTK_STraight PointerRender
发射射线有触发条件找到VRTK_Pointer的Acitivation Button选择
发射出射线之后,我们需要物体有Collider组件
忽略物体需要设置Policy
新建空物体Policy,添加VRTK_Policy_List,就可以再这里选择按照层级,标签脚本。
忽略,包含,也可以选择。
然后把Policy,指定给我们的VRTK_Pointer上的TargetListPolicy属性
首先要对要描边的对象,加组件VRTK_OutlineObjectCopyHighlighter。我们需要去创建自己的脚本PointController来设置点击物体的事件。可以挂载到LeftController和RightController。
脚本实现思路:
首先获取VRTK_Pointer 的引用,我们缓存一下。再缓存两个颜色。EnterColor和MarkerSetColor
获取监听DestinationMarkerEnte,DestinationMarkerExit,DestinationMarkerSet直接按住Table键可以自动补全需要的方法
写自己的私有方法
HighLight(Transform target,Color color){
VRTK_BaseHighlighter=(target!=null?target.GetComponent():null)
if(highlighter!=null)
{
highlighter.Initialise();
if(color!=Color.clear){
highlighter.Highlight(color);
}
else
{
hiighlighter.Unhighlight();
}
}
}
在上面监听的方法退出中添加HighLight(e.target,Color.clear);
在上面监听的方法退出中添加HighLight(e.target,EnterColor);
在上面监听的方法遮罩设置中添加HighLight(e.target,MarkerSetColor);
返回编辑器设置颜色,需要注意的是透明度要设置,代码里的Color默认没有Alpha值
在Canvas身上挂载VRTK_UICanvas
在LeftController(同理)上挂载VRTK_UIPointer以及场景中具有EvebtSystem
默认UI射线只交互不渲染。在LeftControllerScript 上挂在两个组件。VRTK_Pointer和VRTK_STraight PointerRender。
值得注意的是3D物体触发和Ui触发有必要设置一样的触发方式,避免紊乱。
以及注意UI的射线距离需要调整,UI可能位置会特别远。
值得注意的一件事件:UICanvas会自动的为Canvas添加BoxCollider这个组件,这就使得当我们射线扫中时,也会起反应。
如果不想起反应,应注释掉UICanvas自动Canvas添加BoxCollider。2dcollider是不能对射线起作用的。
所以只能给子控件添加boxCollider,一种优雅的做法就是通过脚本来添加碰撞体,并调整大小。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//这个脚本需要给每个需要交互的UI添加上
public class UGUI_AutoBindBoxCollider : MonoBehaviour
{
// Use this for initialization
void Start()
{
BoxCollider collider = gameObject.AddComponent();
collider.size = new Vector3(GetComponent().rect.width,
GetComponent().rect.height, 1);
collider.isTrigger = true;
}
}
曲线一般都是作为瞬移功能的射线。
其余的功能是相同的,区别是使用了VRTK_Bezier PointerRenerer来发射贝塞尔曲线射线,相关属性都可以在面板绘制,跟直线大致相同。
只需要在贝塞尔曲线的基础上多挂载一个组件VRTK_HeightAdjustTeleport就可以了。
瞬移的时候会自带一个渐变效果,可以在VRTK_HeightAdjustTeleport中设置颜色,时间,延时,指定策略(哪些地方可以瞬移,哪些地方不可以)。shou
这个组件受之前VRTK_Pointer属性的Enable Teleport 是否启用瞬移。
瞬移存在另一个组件VRTK_DashTeleport实现。它的功能就是直接过渡,没有渐变效果了。可以调整过度时间速度。SnapToNearestfloor,受附近的物体Y轴向影响。ApplyPlatareaParenyOffset受瞬移区域父物体的Y轴偏移影响。
VRTK_BodyPhysics挂载这个组件的物体会自动添加碰撞和物理。
DestinationPoint传输点功能。需要挂载VRTK_DestinationPoint。传输点有三种效果默认效果,鼠标放上去的效果,锁定状态。这三种效果要指定给VRTK_DestinationPoint。然后指定接下来要传输的位置,SnapToPoint对齐点功能,如果选中点传输对齐坐标,SnapToRotation选中点传输对齐旋转。传输点会自动判断点是否有碰撞体,如果没有碰撞体,那就添加碰撞体。
因为传输点有Cursor的显示,所以可以选择在传输时隐藏射线的Cursor。
手的模型放在控制器下面
Toggle CustomHands按下菜单键切换手模型:
持有两个控制器事件,注册事件切换模型。通过方法控制手的模型隐藏,有一个自带的手和模型,通过VRTK_SDKManager.GetLoadedSDKSetUp()获得引用,不为空,我们就通过VRTK_DeviceFinder.GetCintrillerLeftHand(true);这里的bool值是获得是否是真实的物体拿到的就是模型,如果false,就拿到控制器(详情看官方示例脚本)后续还有方法处理,不赘述。
官方示例展示了按下扳机动食指和触摸板控制大拇指等功能。
VRTK_SDKTranformNodify修复手部模型位置
VRTK_TransformFollow:手部模型需要跟随的点设置,
VRTK_SwapControllerGrabAction:左右手交替换下物体
指针交互方式:之前VRTK_Pointer上关于抓取的设定,关于抓取的物体的位置,一种用射线抓取,另一种使用手柄抓取。
利用组件VRTK_InteractTouch:触摸功能,需要设置手部的碰撞体和VRTK_InteractGrab:抓取功能实现抓取功能。这两个组件有依赖关系,同时挂载代表可以交互了。需要交互的物体挂载VRTK_InteractableObject。需要给VRTK_InteractableObject提供GrabAttachMechanicScripts。我们添加VRTK_ChildOfControllerGrabAttach,添加到VRTK_InteractableObject的GrabAttachMechanicScripts。给这个物体添加刚体。我们还需要对这个物体设置部分。
需要挂载VRTK_InteractUse组件,这样当我们勾选物体上的UseAction属性,就可以触发事件。我们需要自己写脚本,只不过是获得物体的VRTK_InteractableObject的useAction的监听,来触发方法。
使用VRTK_ArtificialRotator脚本,,我们是监听人工旋转器上的MinLimit,MaxLimit触发事件。
我们在自己使用人工旋转器时,应设定旋转轴,设定旋转的指向的子物体,以及需要创建脚本来获取值,我们的脚本中需要获取旋转器,这里可以使用旋转器的基类,来获取添加监听,以触发相关方法。
基于物理的控件是预先定义的可交互对象,通过使用Untiy的Physics来模拟控件。
基于人工的控件时预先定义的可交互对象,可以模拟控件而不使用任何物理。
VRTK_PhysicsPusher(物理推进器):
模拟一个按钮,当它接受外力被推离到极限。实现方式挂载VRTKPhysicsPusher组件,它是使用铰链关节(自动添加),碰撞体(自动添加)。参数跟人工旋转器非常相似。
推进器下面的子物体需要具有VRTK_ControllerRigidbodyActivator脚本负责刚体的激活,当我们的手柄触摸和交互时激活和隐藏刚体。这个组件是必须存在的。在这个子物体上具有刚体和碰撞体(设置成触发器),必须指定给推进器的ExcludeColliderCheckOn组件。
VRTK_ArtificalPusher(人工推进器):
参数相同,只是多了一个设定速度。它在运行的时候只会自动添加碰撞体。
子物体仍然要添加VRTK_ControllerRigidbodyActivator脚本。同时指定给推进器的ExcludeColliderCheckOn组件。
因为物理可能有意料之外的bug,建议使用人工。
总结点:值得注意的是父物体和子物体的碰撞体大小是一致的,子物体需要设置为触发器。然后需要指定ExcludeColliderCheckOn组件还有要忽略的物体。比如桌子平台之类的。
operateAxis:绕着哪个轴旋转
ignoreCollisionsWith:用于忽略碰撞事件的GameObjects集合。
excludeColliderCheckOn:确定是否应创建默认Collider时要排除的GameObjects集合。
minMaxThresholdAngle:在达到最小或最大角度之前,旋转器旋转可以处于最小或最大角度内的角度。
stepValueRange:沿“operateAxis操作轴”注册的旋转器的最小和最大步进值。
stepSize:旋转器值将在“stepValueRange步进值范围”之间变化的增量。
snapToStep:如果选中此选项,则旋转器将沿“stepValueRange步进值范围”捕捉到最近一步的角度。
snapForce:旋转器沿“操作轴”捕捉到相关角度的速度。
detachDistance:手柄和旋转器的距离超过这个值将会自动释放。
rotationAction:确定如何根据抓取对象的操作计算对象的旋转。
1.可交互对象原点与抓取对象附着点之间的角度。
grabbedFriction:抓住旋转器时的模拟摩擦。
releasedFriction:旋转器释放时的模拟摩擦。
disableWhenIdle:如果选中此选项,则在未与Interactable对象进行交互时,将禁用Interactable Object组件。
isGrabbable:确定是否可以抓取Interactable对象。当正在抓取的时候为True,反之Flase
holdButtonToGrab:如果选中此项,则需要持续按住控制器上的抓取按钮以继续抓取。如果取消选中此选项,则抓取按钮会切换抓取操作,只需按一下按钮即可抓取,再按一下钮即可释放。
stayGrabbedOnTeleport:如果选中此项,那么当传送出现时,Interactable Object将一直抓到控制器。如果未选中,则在传送发生时将释放Interactable对象。
validDrop:确定控制器抓取按钮可以在什么情况下删除Interactable Object。
NoDrop - 无法通过控制器删除该对象。
DropAnywhere - 可以通过控制器将对象放在场景中的任何位置。
DropValidSnapDropZone - 只有将对象悬停在有效的快照放置区域上时,才能删除该对象。
grabOverrideButton:设置为xxx将覆盖Interact Grab脚本上的“Grab Button”按钮用于抓取此特定的Interactable对象。
设置为“未定义”将意味着Interact Grab脚本上的“Grab Button”将抓取该对象。
grabAttachMechanicScript:这决定了抓取时抓取的Interactable Object如何链接到控制器。
isUsable:确定是否可以使用Interactable对象。
SecondryGrabActionScript:设置另一个抓取,左右切换功能
holdButtonToUse:如果选中此项,则需要持续按住控制器上的使用按钮以继续使用。
如果取消选中,则使用按钮切换使用操作,按一下按钮开始使用,另一按钮停止使用。
useOnlyIfGrabbed:如果选中此选项,则只有当前正在抓取Interactable Object时才能使用它。
pointerActivatesUseAction:如果选中此项,那么当指针与Interact able对象发生碰撞时,它将激活它的使用操作。
precisionGrab:如果选中此项,那么当Interact Grab抓取Interactable Object时,它将精确地抓取它并在Interact Touch触摸的Interactable Object上的特定点处拾取它。
throwVelocityWithAttachDistance:如果选中,那么当抛出Interactable Object时,Interactable Object的附着点和Interact Grab附加点之间的距离将用于计算更快的投掷速度。
onGrabCollisionDelay:在第一次抓取时会延迟影响Interactable对象的碰撞的时间。
如果Interactable Object在被抓取时可能卡在另一个GameObject中,这将非常有用。
isenabled:如果选中此选项,碰撞器将在碰撞过程中打开和关闭其刚体。
activateinteracttouch:如果选中此选项,则刚性体激活器将激活交互触摸脚本上的刚性体和碰撞器。
activatetrackedcollider:如果选中此选项,则刚性体激活器将在控制器跟踪的碰撞器脚本上激活刚性体和碰撞器。
pressedDistance :沿‘操作轴’的按下距离
statypressed:如果选中此选项,则当推料器达到最大位置时,它将保持在按下位置。
minMaxLimitThreshold :推动器当前沿‘操作轴’的标准化位置必须在推动器的最小和最大限制内的阈值
targetForce :将推动器推向目标位置所需的力。
positionTarget :默认位置,标准化值为‘0f’(起点)到‘1f’(终点)
restingPosition :滑块位于标准化值“0f”(起始点)到“1f”(结束点)中给定的默认静止点时的位置)
forceRestingPositionThreshold :如果滑块未被抓取,则在将其强制返回到“静止位置”之前,滑块必须位于“静止位置”内的标准化阈值
grabMechanic:操作旋转器时要使用的可交互对象抓取机制的类型。
TrackObject - 跟踪对象抓取机制
RotatorTrack - 旋转轨道抓取机制
highlightObjectPrefab:当放置物体的时候放置区域高亮显示的模型,这里指定需要放置的物体。
snapType:将有效的可交互对象放到快照区域中时要应用的快照类型
UseKinematic - 将可交互对象rigidbody设置为“iskinematic=true”。
UseJoint - 将可交互对象的刚体作为“连接体”附加到关节。
UseParenting - 将快照区域设置为可交互对象的父级,并将其刚体设置为“iskinematic=true”。
snapDuration:被放置的物体移动到放置点,位置、旋转和缩放所需的时间。
applyscalingonsnap:如果选中此选项,则放置区域的缩放大小将应用到被放置的对象。
clonenewonnap:如果选中此选项,则当被放置的对象从放置区域取消放置时,该放置对象的克隆将被放回到放置区域。
highlightcolor:放置区域处于活动状态时使用的颜色。
defaultSnappedInteractableObject:指定一个默认放置到放置区域的物体交互对象,要保证这个交互对象在给定的策略列表内。
animationTimeline:如果设置了此选项,则如果同时设置了“Animator Timeline”,则该选项将被忽略。
maxFrames :时间线中的最大帧数
distanceMultiplier :手柄和可交互对象的距离对动画帧数的影响,将距离乘以distanceMultiplier 量。
breakForce :断裂前Joint能承受的最大力。设置为“infinity”可确保关节牢不可破。
strength :弹簧的强度
damper :弹簧的阻尼量
forceKinematicOngrab:如果选中此选项,则当抓取发生时,它将强制可交互对象上的刚体为‘运动学’。
releaseDecelerationDamper :“当释放时模拟持续动量,使可交互对象减速的阻尼器。”数字越高,可交互对象在释放时完全停止的速度就越快。
resetToOrignOnReleaseSpeed :可交互对象释放时返回其原点位置的速度。如果“resetToOrignOnReleaseSpeed ”为“0f”,则不会重置位置。
objectToAffect:“要影响外观的游戏对象。”如果为空,则将使用交互对象(通常是控制器)。
objectToMonitor:要监视交互事件的可交互对象(接近触摸/触摸/抓取/使用)。
gameObjectActiveByDefault:指定的objectToAffect对象是否可用
rendererVisibleByDefault:指定的objectToAffect对象是否渲染
pushbackDistance :回放时将播放区域向后推的额外距离,以防止再次紧靠墙。
crouchThreshold:决定耳机在被视为用户蹲下之前必须降低多少的阈值。最后一个安全位置将只记录在非卧姿位置。
deviceForDirection :将要移动的方向是此设备的方向。
disableOtherControlsOnActive :如果选中此选项,则无论何时更改附加控制器上的轴,其他控制器上相同类型的所有其他对象控制脚本都将被禁用。
affectOnFalling :如果存在“vrtk_bodyphysics”脚本,并且选中了该脚本,则对象控件将在下降时影响Play Area。
controlOverrideObject:要应用对象控件的游戏对象。如果为空,则将控制Play Area。
axisDeadzone :触摸板上的盲区阈值,如果触摸位置在指定盲区内,将忽略输入。介于’0f’和’1f`.’)之间
maximumSpeed:位移的最大速度
deceleration:轴没有改变的时候减速率
fallingDeceleration:当轴不再更改且对象正在下降时的速度减速率
speedMultiplier:当按下Modifier Button时要应用的速度倍增器。
warpDistance:移动的距离
warpMultiplier:当按下Modifier Button时要应用于扭曲的乘数。
warpDelay:在执行另一个扭曲之前需要经过的时间。
floorHeightTolerance:移动前和移动后地板多少的高度公差允许是有效的扭曲。
blinkTransitionSpeed :眨眼特效淡出和淡入的速度。
anglePerSnap :每一次要旋转的角度
angleMultiplier :按下Modifier Button时要应用的旋转角度乘数。
snapDelay :执行另一个捕捉旋转之前需要经过的时间。
axisThreshold:侦听轴需要超过的阈值,如果阈值为0,则忽略该阈值。
additionalMovementMultiplier:较高的数值模拟较大的游戏区域,但可能会太不舒服。
headZoneRadius:如果它低了,蹲下时会感到不舒服。
controlOptions:确定移动参数的设备。(晃动的设备)
HeadsetAndControllers - 跟踪耳机和控制器以进行运动计算。
ControllersOnly - 仅跟踪控制器以进行移动计算。
HeadsetOnly - 仅跟踪耳机以进行移动计算。
directionMethod :确定前进的方法。
Gaze - 将始终朝当前的方向移动。
ControllerRotation - 将沿控制器指向的方向移动(平均)。(一个手柄按下engage button,另一个手柄晃动,将会朝着这个手柄的指向移动)
DumbDecoupling - 当次按下engage button始终将朝着他们第一眼看到的方向移动。
SmartDecoupling - 只有当头盔朝向与控制器相同的方向时,才会朝着它们所看到的方向移动。
EngageControllerRotationOnly - 将沿按下engage button的控制器指向的方向移动。(一个手柄按下engage button,另一个手柄晃动,将会朝着按下engage button手柄的指向移动)
LeftControllerRotationOnly - 将沿左控制器指向的方向移动。
RightControllerRotationOnly - 将沿右控制器指向的方向移动。
smartDecoupleThreshold:在使用 Smart Decoupling Direction Method时,所有被跟踪对象(控制器、耳机)必须在范围内才能更改方向的程度阈值。
sensitivity :“在虚拟世界中注册所需的最大移动量。”减小此值将增加加速度,反之亦然。
buttonThickness :按钮应填充的菜单百分比,1.0是饼图切片,0.1是细环。
offsetDistance :这会在各个按钮之间创建空格。
rotateIcons:按钮图标应根据其弧旋转还是与控制器垂直旋转
iconMargin:图标应保留在按钮内的像素边距
executeOnUnclick:释放按钮时是否应执行按钮操作,而不是在按下按钮时立即执行。
baseHapticStrength:当所选按钮更改或按下按钮时,震动的基本强度。
deadZone :拨号中间的死区
usePointerColor :如果选中此选项,则指针的有效/无效颜色也将用于在碰撞/不碰撞时更改播放区域光标的颜色。
playAreaCursorDimensions :确定播放区域光标和碰撞器的大小。如果值保留为零,则播放区域光标将调整为校准的播放区域空间。
handlePlayAreaCursorCollisions :如果选中此选项,则如果播放区域光标与任何其他对象发生碰撞,则指针颜色将更改为“指针丢失颜色”
headsetOutOfBoundsIsCollision :如果选中此选项,则如果用户的头盔在播放区域光标边界之外,则即使播放区域未与任何内容发生碰撞,也将视为碰撞。
displayOnInvalidLocation :如果选中此选项,则当位置无效时,将显示播放区域光标。
objectToGrab:手柄将要抓取的可交互对象。
objectIsPrefab:如果‘要抓取的对象’是预设的,则需要选中此项;如果‘要抓取的对象’已存在于场景中,则需要取消选中此项。
cloneGrabbedObject:如果选中此选项,则“要抓取的对象”将被克隆到新的可交互对象中,并被手柄抓取,从而使现有可交互对象留在场景中。”
如果要将同一个可交互对象抓取到多个手柄下,则需要勾选。
如果一个被抓取的可交互对象是一个预设对象,则需要勾选。
alwaysCloneOnEnable:如果选中了“Clone Grabbed Object”,并且选中了此选项,则每当禁用并重新启用此脚本时,它将再次创建该可交互对象的新克隆到手柄上。
如果未选中此选项,则原始克隆的可交互对象将尝试再次被捕获。如果原始克隆对象不再存在,则将创建新的克隆。
attemptSecondaryGrab:如果选中此选项,则‘要抓取的对象’将尝试进行次抓取和主抓取。