记录VR开发过程中遇到的问题
当前位置 : 首页 > VR培训

【HTC-VIVE】06-Player脚本组件与Hand脚本组件分析

一、Player脚本组件:

PlayerCS.png
可设置属性:

1、Tracking Origin Transform : 虚拟设备追踪的根节点,即整个虚拟角色 Player
2、Hmd Transforms : 头显设备相机,包括没有Steam VR 时的备用相机
3、Hands:所有的可能的虚拟手柄,包括 没有 Steam VR 时的备用手柄
4、Head Collider : 头部物理碰撞检测器,跟随 玩家的头设位置移动
5、Rig Steam VR :这些对象是在SteamVR可用时启用的物体
6、Rig 2D FallBack :这些对象是在SteamVR不可用时或用户退出VR时启用的
7、Audio Listener : 玩家的音频监听器,让玩家可以听到声音
8、Allow Toggle 2D : 允许切换到2D

其他可访问属性与方法:
  • handCount :获得激活的手的数目(返回类型 int)
  • GetHand( int i ) : 获取 第 i 个激活的手,i从0取值(返回类型 Hand)
  • leftHand :获取左手,如果没有则返回null (返回类型 Hand)
  • rightHand : 获取右手,如果没有则返回null (返回类型 Hand)
  • scale : 获取玩家的缩放,假设在xyz的缩放值一样 (返回类型 float)
  • hmdTransform : 得到HMD的Transform。如果SteamVR不可用或禁用,这可能会返回回备用摄像机Transform。
  • eyeHeight : 眼睛离地的高度-对估计玩家的高度有用。(返回类型 float)
  • feetPositionGuess :猜测玩家的脚的世界空间位置,直接在HMD下方(返回类型 Vector3)。
  • bodyDirectionGuess : 猜测玩家臀部/躯干的世界空间方向,它可能不准确,具体取决于玩家的站姿(返回类型 Vector3)。
  • PlayerShotSelf() : 空的方法,内部可以自己编写内容,做适当的处理。
使用方法与技巧:
  • Player 脚本是个单例对象,这意味着场景中应该只有一个玩家对象。,可以通过Instance 访问该类的所有公共属性。
  • 玩家自己没有做什么,除了跟踪手和hmd。-它可以在整个项目和交互系统的许多方面进行全局访问,假设玩家对象始终存在于场景中。
  • 它还可以跟踪你是在VR模式还是2D备用模式。
  • 通过Player类使用访问器允许其他组件在不知道是否使用VR耳机或鼠标/键盘的情况下使用类似的功能。2D备用模式是有用的,但有其局限性。我们主要使用这种模式测试非常简单的交互,只需要1只手和触发器按钮。在开发过程中,当团队中的每个人不可能在任何时候都带着VR头盔的时候,它是非常有用的。

注意:

  • 玩家类是用来在编辑器场景视图中使用图标来显示脚和手的,但是由于Unity的工作方式,这些图标必须放在一个特定的文件夹中才能工作。这些图标在Core/ icons下提供。将它们移动到项目资产树的根目录中名为“Gizmos”的文件夹中,它们应该可以工作。

  • 2D备用模式在测试过程中可能很有用,但它可能不是你想在你完成的游戏中发布的东西。有两种方法可以禁用它:在构建之前取消对场景中播放器对象的“允许切换到2D”bool的勾选。将“HIDE_DEBUG_UI”添加到项目PlayerSettings中的脚本定义符号列表。这只会在游戏构建中禁用2D debug视图,同时允许您在编辑器中继续使用它。



二、Hand脚本组件:

以左手Hand为例

HandCS.png
可设置的属性:

1、OtherHand:其他手(该脚本是左手,因此此处对应放右手Hand)
2、HandType:该手的类型(该脚本左手物体,所以设置 Left Hand)
3、Tracked Object : 可跟踪对象的脚本(在下方挂载SteamVR_Behaviour_Pose 即可,在运行时可以自动设置,也可以拖动设置)

4、Grab Pinch Action :
5、Grab Grip Action
6、Haptic Action :
7、Ui Interact Action

8、Use Hover Sphere : 是否使用触碰悬停球形显示
9、Hover Sphere Transform :触碰悬停球形显示位置
10、Hover Sphere Radius : 触碰悬停球形的球半经
11、Hover Layer Mask : 触碰悬停球形所触碰到的可检测的Layer
12、Hover Update Interval : 触碰悬停检测更新间隔时间

13、Use Controller Hover Component :是否使用控制器悬浮组件
14、Controller Hover Component : 控制器悬浮组件名
15、Controller Hover Radius :控制器悬浮组件半径

16、Use Finger Joint Hover : 是否使用指关节悬停
17、Finger Joint Hover :具体指关节部位
18、Finger Joint Hover Radius : 指关节悬停球半径

19、Object Attachment Point : 在手上的一个附着对象的中心点位置(就是把物体拿在手上的中心附着点)

20、noSteamVRFallbackCamera : 没有 SteamVR设备时的备用相机(在备用手柄FallBackHand上才设置)
21、No SteamVR Fallback Max Distance No Item
22、No SteamVR Fallback Interactor Distance

23、Render Model Prefab : 手部渲染显示的模型预制体

24、Show Debug Text :是否显示在虚拟环境中手旁的 Debug 文本(比如摸到的物体名,拿在手里没,拿在手里的持续时间等)
25、Spew Debug Text : 是否在编辑器控制台中打印 Debug 文本
26、Show Debug Interactables :是否显示 绘制 调试 交互线。

其他可访问属性与方法:
  • AttachedObjects : 手上附着的物体集合(ReadOnlyCollection<AttachedObject> :只读List)
  • hoverLocked : hover 触摸悬停状态是否锁定物体
  • isActive : 追踪设备行为是否激活
  • isPoseValid : 当前姿势是否处于有效状态
  • hoveringInteractable : 这只手目前正在悬停的可交互对象(返回类型 Interactable)

  • currentAttachedObject : 获取刚附着的激活的物体(返回类型 GameObject)
  • currentAttachedObjectInfo : 获取刚附着的激活物体的相关信息(返回类型 AttachedObject)

  • ShowController(bool permanent = false) : 显示控制手柄(若传递ture ,则手柄默认状态更改为显示)
  • HideController(bool permanent = false):隐藏控制手柄(若传递ture ,则手柄默认状态更改为隐藏)
  • ShowSkeleton(bool permanent = false) : 显示手模型(若传递ture ,则手模型默认状态更改为显示)
  • HideSkeleton(bool permanent = false) : 隐藏手模型(若传递ture ,则手模型默认状态更改为隐藏)
  • Show() : 显示手柄与手模型
  • Hide() : 隐藏手柄与模型

  • SetSkeletonRangeOfMotion(EVRSkeletalMotionRange newRangeOfMotion, float blendOverSeconds = 0.1f) : 永久设置手模型的运动改变
    public enum EVRSkeletalMotionRange
    {
    WithController = 0,
    WithoutController = 1,
    }
    blendOverSeconds : 混合到新动作的时间

  • SetTemporarySkeletonRangeOfMotion(SkeletalMotionRangeChange temporaryRangeOfMotionChange, float blendOverSeconds = 0.1f) : 为这个动作设置一个可以轻松重置的临时动作范围(使用ResetTemporaryRangeOfMotion恢复)。

  • ResetTemporarySkeletonRangeOfMotion(float blendOverSeconds = 0.1f) : 重置先前设置的临时运动范围。

  • SetAnimationState(int stateValue) : 设置手的动作为第几号动作(0,1,2,3:0:Rest ,1:SphereGrab,2:StickGrab,3:pinchGrab)

  • StopAnimation() : 停止动话默认恢复到 0:Reset 动画


  • AttachObject(GameObject objectToAttach, GrabTypes grabbedWithType, AttachmentFlags flags = defaultAttachmentFlags, Transform attachmentOffset = null) : 将GameObject附加到此手GameObject
    参数:
    objectToAttach :要附加的GameObject
    flags:用于附加对象的Flag
    attachmentPoint:这只手的层次结构中的GameObject的名称,它应该作为这个GameObject的附着点
[Flags] public enum AttachmentFlags { SnapOnAttach = 1 << 0, // 物体应吸附在手上指定的附着点的位置。 DetachOthers = 1 << 1, // 与这只手相连的其他物体将被分离。 DetachFromOtherHand = 1 << 2, // 这个物体将与另一只手分离。 ParentToHand = 1 << 3, // 对象将被父化到手。 VelocityMovement = 1 << 4, // 物体将尝试移动以匹配手部的位置和旋转。 TurnOnKinematic = 1 << 5, // 物体不会对外界物理做出反应,成为运动学刚体。 TurnOffGravity = 1 << 6, // 物体不会对外界物理做出反应。 AllowSidegrade = 1 << 7, // 该对象能够从捏抓取切换到抓地力抓取。减少好抛的可能性,也减少意外跌落的可能性 }; 
  • ObjectIsAttached(GameObject go) : 判断物体是否被抓取附着(返回类型 bool )
  • ForceHoverUnlock() : 强制解除悬停锁定物体状态,hoverLocked变为false
  • DetachObject(GameObject objectToDetach, bool restoreOriginalParent = true) : 从这只手的附加对象堆栈中分离出这个GameObject(restoreOriginalParent:表示是否把该物体放回原来的父物体下)

  • GetTrackedObjectVelocity(float timeOffset = 0) :得到VR手的世界速度,timeOffset:是否获取预测或者之前的值,0表示当前时间点,(f返回类型 Vector3)
  • GetTrackedObjectAngularVelocity(float timeOffset = 0) : 得到VR手的世界角速度,timeOffset:是否获取预测或者之前的值,0表示当前时间点,(f返回类型 Vector3)
  • GetEstimatedPeakVelocities(out Vector3 velocity, out Vector3 angularVelocity) :使用之前记录的值来找到姿态的峰值速度,并返回相应的速度和角速度

  • HoverLock(Interactable interactable) :继续悬停在这个物体上,不管手是否离开它的交互触发区。
    参数:interactable :可无限悬停的交互物体。
  • HoverUnlock(Interactable interactable) : 停止在这个物体上无限期地悬停
  • 参数:interactable :要停止无限悬停的交互物体。

  • TriggerHapticPulse(ushort microSecondsDuration)
    TriggerHapticPulse(float duration, float frequency, float amplitude): 触碰震动反馈(参数:持续时间,震动频率,震动强度)

  • ShowGrabHint() :显示抓取动作按钮提示
  • HideGrabHint() :隐藏抓取动作按钮提示
  • ShowGrabHint(string text) : 显示抓取动作按钮与提示文字

  • GetGrabStarting(GrabTypes explicitType = GrabTypes.None) : 获取正在开始抓取的抓取方式,是Grip,还是Pinch,可以传入期待的正在开始进行抓取的方式,如果不是则返回 GrabType.None;(返回类型GrabType)
  • GetGrabEnding(GrabTypes explicitType = GrabTypes.None) :获取正在结束抓取的抓取方式,是Grip,还是Pinch,可以传入期待的正在进行结束抓取的方式,如果不是则返回 GrabType.None;(返回类型GrabType)

  • IsGrabEnding(GameObject attachedObject) : 判断抓取物体是否结束被抓取(返回类型 bool)

  • IsGrabbingWithType(GrabTypes type) : 判断某抓取方式是否正在抓取状态持续中(返回类型 bool)
  • IsGrabbingWithOppositeType(GrabTypes type) 判断某抓取方式的相反方式是否正在抓取状态持续中(返回类型 bool)

  • GetBestGrabbingType() : 获取最佳的抓取方式(假设同时触发 Grip与Pinch两种抓取姿势)

  • SetRenderModel(GameObject prefab) :更改设置手的渲染模型,并重新初始化手柄控制器(参数 :要换成的新的手的模型)
  • SetHoverRenderModel(RenderModel hoverRenderModel) : 设置悬停到物体上的高光显示模型(参数:RenderModel)

  • GetDeviceIndex() : 获取设备编号(返回类型 int)

作者:lijianfex
链接:https://www.jianshu.com/p/7da3e66437bf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

栏目列表