【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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容