AutoHand插件使用指南

一、设置

1.软件包设置

Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。

这里只介绍OpenXR(Action Based),首先作如下设置:

我这里用的是HTC Vive Pro:

找到并导入AutoHand插件中的OpenXR这个包:

2.安装向导

完成设置后,您应该会看到一个用于自动设置的弹出窗口(如果您的项目没有错误)
此设置窗口将允许您从推荐的物理设置列表中进行选择。这些设置专门用于帮助改善手和世界中物体之间的动态物理交互。更高质量的设置将产生更高质量的动态交互,增加视觉平滑度,减少物理抖动的变化,并增加关节交互的稳定性。

低(不推荐)
中(通常不推荐)
高(推荐用于 Quest 2 或 PC)
非常高(推荐用于 PC)

3.所需的物理层

如果有足够的空物理层点,设置向导还将自动为项目添加所需的物理层。这些层有助于防止某些物理错误并增加优化。

这些图层由设置向导自动生成,除非您的项目没有四个可用空间。

二、控制器输入

Auto Hand 不直接创建任何控制器输入,而是包括“Link”组件,这些组件将来自您正在使用的任何输入系统的控制器事件转换为 Auto Hand 事件。
强烈建议详细了解您正在使用的输入系统以获得高级输入功能。

1.手输入(OpenXRHandControllerLink.cs)

管理手对应的控制器输入:Trigger按键的Grab/Release 对应 Squeeze/Unsqueeze事件。

2.手指弯曲输入(OpenXRAutoHandFingerBender.cs)

管理控制器输入弯曲单个手指,Offset将按偏移量百分比 0-1 来调整给定手指的弯曲度。

例如,如果食指偏移量为 1,则当控制器输入被触发时,食指将完全弯曲。

3.玩家移动输入(OpenXRHandPlayerControllerLink.cs)

管理 Auto Hand Player 运动和转动轴的输入。

4.距离抓取输入(OpenXRHandPointGrabLink.cs)

管理手距指示器的开始/停止指向和开始/停止选择功能的输入。

5.传送输入(OpenXRTeleportLink.cs)

管理 Teleporter Pointer 组件的控制器输入。

6.输入事件/UI 事件

带有附加到控制器操作的 Unity 事件的通用脚本。

7.手部追踪输入

三、设置新手

操作步骤视频链接:Autohand 教程之设置一双自定义的手_哔哩哔哩_bilibili

要设置自定义手,您必须遵循以下步骤:

1.(可选。)将碰撞器Collider添加到手和手指关节(Rig)上。BoxCollider或CapculeCollider都很好用。确保碰撞器放置在适当的骨架点下方,以便它们随手的关节Rig一起移动;

2.将 Hand 组件应用到绑定手关节的根部;

3.将 Finger 组件应用并设置到每个手指骨骼关节位置的根部:

(1)添加空物体到手指骨骼的末端,并将其命名为Tip后,拖拽到Finger下的Tip值中;

(2)调整“Tip”的位置和半径,以尽可能匹配指尖的表面(确保能够看到指尖的Gimos);

4.将手的骨骼关节调节成平手打开姿势,然后点击Hand组件底部的“Save Open Pose”按钮(或右键单击脚本并单击Save Opened);

注意:为了获得更好的效果,将张开的手指尽可能向后弯曲。(您可以通过将手上的“Grip Offset”值增加到 ~0.1-0.25 来抵消游戏中的这种影响)

5.将手的骨骼关节调节成握拳状态,然后点击Hand组件底部的“Save Open Pose”按钮(或右键单击脚本并单击Save Opened);

6.根据您使用的输入包添加 Controller Link 和 Finger Bender 组件。

注意:建议在此处创建/保存预制体。

7.您可以复制这只手并将其用作左手(或重复此过程)

(1)创建副本;

(2)通过将副本的Transform下的Scale X值设置为负值来反转手;

(3)将Hand组件上的“Left”值设置为 true 或 false。

注意:如果您使用的是自定义Inspector(如 Odin)并且看不到“Save”按钮,则可以尝试使用上下文菜单作为替代方法,方法是右键单击Hand组件:

四、手

1.Hand组件

Auto Hand 的核心组件。它将管理抓取(Grab)、突出显示(Highlight)、摆姿势(Pose)和移动(Move)。需要刚体Rigidbody。该组件应添加到手部模型的根部,其中应包含骨骼绑定和在其下方渲染的蒙皮网格(Skinned Mesh Render)。

手需要Finger组件和手掌Palm的位置来生成姿势。

Fingers:

骨架上的每个关节都应该有一个Finger组件。手指需要一个表示指尖和指尖半径的Transform(这将充当自动抓取的缓冲器)。必须先设置手指关节,然后才能Save Open/Close Pose。

Palm Transform:

Palm Transform表示抓取的点和前方方向。这将影响自动抓取在手中的位置以及寻找抓取目标的圆锥体的投射位置。

这应该是放置在手掌中心的空Transform,局部正向旋转(蓝色箭头)背对着手。

Enable Movement:

手将遵循给定的Transform并使用Rigidbody上的力匹配其Position/Rotation。
您可以通过禁用此Enable Movement或将Rigidbody设置为运Is Kinematic来禁用运动。
如果手与跟随目标的距离大于最大跟随距离,则手将传送到跟随位置。如果手在传送期间持有可抓取物,它将根据可抓取物的“parent on grab”值 释放或携带持有的对象。

Follow表示手的Transform会用物理运动来尝试匹配。

(建议Follow在Controller下做一个空transform,可以用来偏移手的Position/Rotation)

  1. Max Follow Distance:如果大于此距离,将强制手传送到跟随变换;
  2. Throw Power:将释放时抓取对象的速度乘以该值;
  3. Enable Interpolation:当 FPS 高于固定时间步长时,对Hand使用位置插值以使其看起来更平滑。

Enable Auto Posing:

执行自定义动画时禁用此模块。姿势模块将更新手指、创建手指摆动并寻找自定义姿势区域。 Grab/AutoPose 功能仍将执行姿势。

  1. Sway Strength:将是手移动时手指摇晃的程度,0 表示禁用;
  2. Grip Offset:将抵消每个手指的弯曲。 0.14 是轻微弯曲 1 是完全弯曲

注意:在没有任何自定义姿势组件的情况下抓取 Grabbable 时,自动姿势是默认设置

Enable Highlight:

Highlight模块将查找可抓取的对象以高亮。这是一个被动系统,在不使用时应出于优化目的而禁用。如果Highlight lays什么都没有留下,它将默认为可抓取的,因此请确保禁用启用高光的切换。

当目标对象被抓取时触发高亮事件。

  1. Highlight Layers:表示Highlight模块将搜索的层,(如果不勾选表示禁用Highlight,则默认为可抓取,取消选中则表示启用Highlight);
  2. Default Highlight:Material将应用于所有没有高亮材质的抓取物;

Highlight Material 的工作原理是复制目标可抓取的网格Mesh,应用Highlighted材质,然后稍微放大它。

Show Advanced:(高级选项)

  1. Grab Type:决定手伸过去抓物体、物体移动到手上、还是瞬间抓取;
  2. Grab Curve:表示抓取时间的动画;(x = 从 0-1 抓取时间,y = 从 0-1 抓取姿势)
  3. Gentle Grab Speed:如果启用了可抓取的轻柔抓取值,则乘以返回对象所需的控制器移动;
  4. Pose Index:必须匹配Pose组件的姿势索引才能工作(添加以支持每个游戏的多个手部模型)

事件:

虽然 Auto Hand 包含内部 C# 事件,但可以通过 Hand Public Events 组件可以找到公共 Unity 事件。

  1. On Before Grab:在确认可以进行抓取之后,在抓取开始之前调用;
  2. On Grab:在建立抓取连接后,当手接触到抓取对象时调用;
  3. On Release:当手释放可抓取对象时被调用;
  4. On Force Release:当被强制“Dropped丢弃”,而不是正常释放时,被调用;
  5. On Squeeze:在握住可抓取物时,触发挤压按钮时调用。挤压按钮由 Hand Controller Link 设置决定(在Demo中附加到手下的“Input”游戏对象)。

Controller Input:

管理用于手抓取/释放触发器和挤压/松开事件的控制器输入:

Haptic Collisions:

可以添加到 Hand 对象的可选组件是 Hand Collision Haptics,当手与碰撞触发遮罩上的对象发生碰撞时,此组件将导致控制器Vibration振动(如果输入系统支持)。

Grab Lock:

您可以将 Grab Lock 组件添加到 Grabbable 对象上,以防止通过通常的 Hand.Release() 方法释放它。相反,您必须调用 Hand.ForceRelease() 或 Hand.ReleaseGrabLock() 方法来使用此组件放置可抓取对象。

程序代码如下:

Auto Hand 手有四个基本函数,Grab()、Release()、Squeeze() 和 Unsqueeze()。

Grabbing:

抓取最好使用默认的 Grab() 函数来完成,但仅抓取手前面的东西并不适合所有用例。虽然 Grab() 函数最一致,但如果您不希望获得正确的光线投射,则可以改用 TryGrab() 函数。

//会抓住手掌前面和最靠近手掌的任何东西
hand.Grab()

//将抓住光线投射命中的可抓取目标
hand.Grab(RaycastHit hit, Grabbable target)

//将尝试自动创建可用的光线投射命中以仅对目标进行抓取
hand.TryGrab(Grabbable target)

//(适合通过网络同步抓取)
//将使用给定值强制创建抓取连接而不创建自动姿势
hand.CreateGrabConnection(Grabbable grab, Vector3 handPos, Quaternion handRot, Vector3 grabPos, Quaternion grabRot, bool executeGrabEvents = false)

Releasing:

Release() 函数将释放手当前握住的任何东西,并将手的速度和投掷力应用到可抓取的物体上。 ForceRelease() 将在不施加投掷力的情况下释放可抓取物。两者都会调用 OnReleaseEvent。

//将释放手并增加手投掷速度
hand.Release();

//将在不应用 throw 的情况下释放 hands 对象(就像它被丢弃一样)
hand.ForceRelease();

Squeezing:

Squeeze() 函数用于在抓取对象上调用附加事件,并在按住时通过控制器输入。

//将触发手上的挤压事件并保持可抓取
hand.Squeeze();

//将触发手上的 unsqueeze 事件并保持可抓取
hand.Unsqueeze();

Haptics:

如果您的设备支持该系统,则支持 XR、SteamVR 和 OVR 的自动手部触觉(目前 OpenXR 不支持触​​觉)

//如果输入系统和设备支持,将在手上播放触觉
hand.PlayHapticVibration()
hand.PlayHapticVibration(float duration)
hand.PlayHapticVibration(float duration, float amp)

Auto Posing Function:

高级用户可能只想在他们的系统中使用自动姿势生成。为此,您必须在抓取目标的表面上获得光线投射命中点。

//这将生成手部模型并将其设置为基于光线投射命中和 grabbabe 的抓取姿势
//这不会创建抓取连接或调用抓取事件
hand.AutoPose(RaycastHit hit, Grabbable grabbable)

SetLocation:

您可以使用 hand.SetLocation(Vector3 position, Quaternion rotation) 来设置手的Position/Rotation。如果手在这个函数调用期间持有一个可抓取对象,它将根据可抓取对象的“抓取父对象”是否为true来释放或携带持有的对象。

//将设置手的position/rotatation
hand.SetLocation(Vector3 position, Quaternion rotation) 

编程事件:

using UnityEngine;
using Autohand;

public class HandEventTemplate : MonoBehaviour{
    public Hand hand;

    void OnEnable() {
        hand.OnBeforeGrabbed += OnBeforeGrabbed;
        hand.OnGrabbed += OnGrabbed;
        hand.OnBeforeReleased += OnBeforeReleased;
        hand.OnReleased += OnReleased;
        hand.OnForcedRelease += OnForcedRelease;
        hand.OnGrabJointBreak += OnGrabJointBreak;

        hand.OnHandCollisionStart += OnHandCollisionStart;
        hand.OnHandCollisionStop += OnHandCollisionStop;
        hand.OnHandTriggerStart += OnHandTriggerStart;
        hand.OnHandTriggerStop += OnHandTriggerStop;

        hand.OnHighlight += OnHighlight;
        hand.OnStopHighlight += OnStopHighlight;

        hand.OnSqueezed += OnSqueezed;
        hand.OnUnsqueezed += OnUnsqueezed;

        hand.OnTriggerGrab += OnTriggerGrab;
        hand.OnTriggerRelease += OnTriggerRelease;
    }

    void OnDisable() {
        hand.OnBeforeGrabbed -= OnBeforeGrabbed;
        hand.OnGrabbed -= OnGrabbed;
        hand.OnBeforeReleased -= OnBeforeReleased;
        hand.OnReleased -= OnReleased;
        hand.OnForcedRelease -= OnForcedRelease;
        hand.OnGrabJointBreak -= OnGrabJointBreak;

        hand.OnHighlight -= OnHighlight;
        hand.OnStopHighlight -= OnStopHighlight;

        hand.OnSqueezed -= OnSqueezed;
        hand.OnUnsqueezed -= OnUnsqueezed;

        hand.OnTriggerGrab -= OnTriggerGrab;
        hand.OnTriggerRelease -= OnTriggerRelease;

        hand.OnHandCollisionStart -= OnHandCollisionStart;
        hand.OnHandCollisionStop -= OnHandCollisionStop;
        hand.OnHandTriggerStart -= OnHandTriggerStart;
        hand.OnHandTriggerStop -= OnHandTriggerStop;
    }

    void OnBeforeGrabbed(Hand hand, Grabbable grab) {
        //在抓取对象之前调用
    }

    void OnGrabbed(Hand hand, Grabbable grab) {
        //抓取对象时调用
    }

    void OnBeforeReleased(Hand hand, Grabbable grab) {
        //在释放持有的对象之前调用
    }

    void OnReleased(Hand hand, Grabbable grab) {
        //当持有的对象被释放时调用
    }

    void OnForcedRelease(Hand hand, Grabbable grab) {
        //调用强行释放函数时调用

    }

    void OnGrabJointBreak(Hand hand, Grabbable grab) {
        //当可抓取的手之间的关节断开时调用
    }

    void OnHighlight(Hand hand, Grabbable grab) {
        //当手抓住一个新对象时调用
    }
    
    void OnStopHighlight(Hand hand, Grabbable grab) {
        //当抓手停止瞄准对象时调用
    }

    void OnSqueezed(Hand hand, Grabbable grab) {
        //在调用“Squeeze”事件时调用,此事件通过手上的 HandControllerLink 组件绑定到辅助控制器输入
    }
    void OnUnsqueezed(Hand hand, Grabbable grab) {
        //在调用“Unsqueeze”事件时调用,此事件通过手上的 HandControllerLink 组件绑定到辅助控制器输入
    }

    void OnTriggerGrab(Hand hand, Grabbable grab) {
        //在调用“抓取”事件时调用,无论是否正在抓取某些东西
    }
    void OnTriggerRelease(Hand hand, Grabbable grab) {
        //在调用“释放”事件时调用,无论是否持有或释放某物
    }

    void OnHandCollisionStart(Hand hand, GameObject other) {
        //当手第一次碰到一个物体并且还没有发生碰撞时调用
    }

    void OnHandCollisionStop(Hand hand, GameObject other) {
        //当所有手对物体的碰撞为零时调用

    }

    void OnHandTriggerStart(Hand hand, GameObject other) {
        //当手第一次触发对象并且尚未触发时调用
    }

    void OnHandTriggerStop(Hand hand, GameObject other) {
        //当手有零个碰撞器重叠此触发器时调用

}

2.Finger组件

Finger组件应放置在每个手指骨骼的关节上。该组件包含手的打开/闭合姿势数据,并管理用于生成自动姿势的手指弯曲/停止算法。

  1. Tip:这是表示该手指的指尖位置的Transform;
  2. Tip Radius:指尖缓冲器的半径;
  3. Bend Offset:这将添加到当前的手指弯曲:0 是不弯曲,0.5 是半弯曲,1 是完全弯曲;
  4. Smooth Speed:值减少表示手指移动速度更慢,值增加表示手指移动速度更快。

Finger Bending:

单独的手指弯曲输入可以通过各种 Finger Bender 脚本进行管理,示例可以在 examples hands 的根目录下找到,附加到 Finger Bender 对象。

Offset 将按偏移量百分比 0-1 调整给定手指的弯曲度。

例如,如果食指偏移量为 1,则当控制器输入被触发时,食指将完全弯曲。

3.Hand Projector

Hand Projector组件将允许您根据Hand Projector上的设置添加“soft grab软抓取”或“highlight grab高光抓取”效果
Hand Projector 创建手的空副本,除了 Hand 组件和模型/可视化组件之外的所有内容都被删除。

Soft Grab Setup:

要创建柔和的抓取效果,您将启用隐藏手并为主手添加网格渲染器MeshRender。这将使主手在Hand Projection发生时不可见。
您还需要启用 Use Grab Transition 值。当抓握轴大于 0 时,这将使用 Hand Controller Link 上的 Grip Axis 值在root手姿势和target抓取姿势之间转换手。

Highlight Grab Setup:

也称为“幽灵手”,此设置配置将创建手的副本,该副本将显示手在瞄准抓取对象时将采取的抓取姿势。
这只手还应该在手副本的网格渲染器Mesh Renderer上有一个自定义材质,以将其区分为高光手。

  1. Hand:这个投影正在复制的主要手;
  2. Hand Projection:该组件的空手副本应仅附加到Hand、Finger、Rig和MeshRenderer组件上;
  3. Hand Projection Visuals:这个Hand Projection 副本的可视化组件,不能是上面有这个脚本的对象,应该是包含Rig和MeshRenderer的手下面的对象;
  4. Speed:是Hand Projection移动以匹配目标姿势和位置的速率。将其调高会产生更快速的投影,但如果调得太高有时会抖动;
  5. Hide Hand:投影发生时是否应隐藏根手。适用于柔和的抓取效果,看起来手在实际执行抓取之前平滑地过渡到抓取;
  6. Use Grab Transition:Hand Projection是否应根据手握轴在手姿势和目标姿势之间进行插值,或者手是否应使用抓取百分比值;
  7. Grab Transition Offset:将按此给定百分比从 0-1 偏移抓取过渡;
  8. Grab Distance Multiplier:将根据 handcontrollerlink 抓取轴乘以手与其目标Position/Rotation的接近程度;
  9. Grab Transition Multiplier:将根据 handcontrollerlink 抓取轴乘以手与其目标姿势的接近程度;
  10. Grab Percent:在根姿势和目标姿势之间插入多少投影姿势。 1 是完全目标姿势; 0 是根手姿势。

事件:

遵循与手高亮/停止高亮事件相同的规则。

五、抓取

1.Grabbable组件

基本信息:该组件将使任何带有Collider的Rigidbody对象都可以被使用中的手抓取。

抓取对象在被握住时“feels感觉”的方式取决于手/抓取对象的Rigidbody刚体设置。根据Mass质量和Drag阻力设置,物体会感觉更重/更轻或更多/更少空气动力学。这是因为手是由刚体力驱动的,手和可抓取物之间的连接是通过物理关节来管理的。

抓取对象必须添加到刚体中或刚体下方。一个由多个碰撞体组成的刚体对象可以有多个可抓取对象,因为可抓取对象设置基于每个碰撞体。默认情况下,如果启用了 Make Children Grabbable 值并且没有找到其他可抓取对象,则可抓取对象下的所有碰撞器将自动变为可抓取对象。

  1. Body:必须连接到刚体;(如果找到,这将在开始时自动填充本地刚体)
  2. Highlight Material:将创建可抓取网格的副本并在highlight时将此材质应用于它;
  3. Copy Setting:将使用包含的 grabbable 覆盖此 grabbables 设置;
  4. Grab Type:这个值决定了对象是如何被手抓住的;
  5. Default:grabbable 将默认为抓取手的设置;
  6. Hand to Grabbable:手会去抓取并把它带回跟随目标;
  7. Grabbable to Hand:grabbable 会飘到手上;
  8. Hand Type:哪些手可以抓取(双\左\右);
  9. Single Hand Only:是否允许多只手抓取这个物体;
  10. Allow Held Swapping:抓住单手物体时是否应换成另一只手;
  11. Use Gentle Grab:如果启用,抓取时手不会自动返回,而是会根据您的控制器移动和手轻柔抓取速度返回;
  12. Maintain Grab offset:将创建一个等于抓取对象的Position和Rotation差异的偏移量(非常适合您不希望手在抓取时返回的杠杆和门把手之类的东西)
  13. Ignore weight:将应用Movement Follower组件(仅在持有时)来模拟失重;
  14. Parent On Grab:将 grabbable 的父级设置为抓取时 Hand 的 PARENT。对于您可以捡起并带走的任何物品都应如此。当玩家被传送时会检查此标志,以决定是将对象带到传送上还是与玩家一起,或者丢弃;此标志还将允许身体在移动时移动物体,以便在行走/拿着物体时获得更平滑的结果;
  15. Joint Break Force:将确定断开关节和手连接所需的力。该值可以设置为“无穷大”,因此连接永远不会突破物理力(如果手和抓取物之间的刚体质量/密度差异太大,这可能会导致抖动)。

  1. Make Children Grabbable:如果为 true,这个带有碰撞器的可抓取对象的所有子项都将在 Start() 上被赋予一个可抓取子组件,这将允许它被抓取,即使它没有直接的可抓取组件;
  2. Grab Priority Weight:通过将抓取射线投射命中距离除以该值来创建抓取优先级。抓取由最近的光线投射命中距离决定;
  3. Ignore Release Time:确定手在松开时将忽略可抓取物的碰撞器的时间。允许更平滑地释放抛出的物体,建议将门和墙壁等设置为 0;
  4. Custom Grab Joint:将用手和可抓取物之间的自定义物理关节覆盖手创建的默认固定关节。要创建自定义关节,请在根部制作带有刚体和自定义关节的预制件,然后将该预制件连接到该值;
  5. Jointed Bodies:应该把所有连接到这个可抓取的动态关节刚体。例如,在创建手持按钮时,您可以将刚体的可抓取底座连接到按钮的关节弹簧上;
  6. Held Ignore Colliders:握住这个 grabbable 的手只会在握住这个 grabbable 时忽略这些碰撞体。例如,您不希望门碰撞器干扰手碰撞器的门把手;
  7. Pull Apart Break Only:将使它只有在关节断裂期间两只手握住可抓取物时才会调用 OnBreak 事件。 (此选项可用,因为可以用一只手通过连接对象或通过将对象强制为静态对象来创建中断事件)

一个对象可以有多个抓取对象,每个对象的碰撞器都有不同的指令。这意味着只要 grabbables 在根“body”下是连接的,它们都可以有自己的自定义设置。

注意:刚体设置将影响可抓取物的处理方式。

  1. On Grab:在建立抓取连接后,当手接触到抓取对象时调用;
  2. On Release:当手释放可抓取对象时被调用;
  3. On Squeeze:在握住可抓取物时触发挤压按钮时调用。挤压按钮由 Hand Controller Link 设置决定(在Demo中附加到手下的“Input”游戏对象);
  4. On Highlight:当这个可抓取对象首先成为手的抓取目标时触发;
  5. On Joint break:每当手关节连接断开时调用,除非激活“Pull-Apart Break Only”,其中只有当关节断开并且两只手握住可抓取物时才会调用它(这是为了模拟撕开物体)。
  1. On First Grab: 仅在当前没有手抓取此对象时调用;
  2. On Last Release:仅在最后一只手释放此可抓取对象时调用。

程序代码如下:

Releasing:包括强制从可抓取类中释放/删除的功能。

//将使所有牵着的手松开这个物体
grabbable.HandsRelease()

//将使给定的手释放该对象
grabbable.HandRelease(Hand hand)

//将使所有手释放该对象,而不施加投掷力(就好像它被丢弃一样)
grabbable.ForceHandsRelease()

//将使给定的手释放该对象,而不施加投掷力(就好像它被丢弃一样)
grabbable.ForceHandRelease(Hand hand)

Haptics:

如果您的设备支持该系统,则支持 XR、SteamVR 和 OVR 的自动手部触觉(目前 OpenXR 不支持触​​觉)

//如果输入系统和设备支持,将在手上播放触觉
grabbable.PlayHapticVibration()
grabbable.PlayHapticVibration(float duration)
grabbable.PlayHapticVibration(float duration, float amp)

Getters:

//返回持有这个可抓取物的手的列表
grabbable.GetHeldBy()

//如果放置或突出显示,则返回可抓取的 placePoint,如果没有则返回 null
grabbable.placePoint

Grab Lock:

grab lock 组件可用于防止在触发常规释放时抓取对象掉落。新的“On Grab Pressed”事件将在抓取锁定物品被“抓取”在手中时调用。

Grabbable Throw Event:

只有在以“break velocity”的速度幅度释放可抓取对象并与包含的“碰撞层”中的某物发生碰撞后,才会触发此 throw 事件:

Grabbable Child:

Auto Hand 的抓取检查是针对每个碰撞器完成的,这意味着如果您的抓取对象由许多碰撞器组成。

  1. 只要连接到同一个刚体“主体”,就可以将可抓取组件添加到可抓取对象的子对象中。
  2. 您可以启用“Make Children Grabbable”,这将自动将此脚本应用于可抓取根下的所有符合条件的Collider。
  3. 您可以手动将此 Grabbable Child 组件应用到您想要使其可抓取的每个Collider。

2.Hand Distance Grabber组件

Distance Grabber:Hand Distance Grabber 负责使用 Distance Grabbable 组件管理目标和选择对象。

  1. Primary Hand:是它所连接的手的手部组件;
  2. Secondary Hand:是另一只手的手组件(如果主手是右手,则这将是左手)。
  1. Forword Pointer:是表示 指针线 的起点和前进方向的Transform;
  2. Line:是将管理抓取 指针线 的视觉属性的线渲染器;
  3. Max Range:将是距离抓取可能的最大距离单位;
  4. Layers:代表距离抓取可能的物理层,(为了便于使用)如果设置为空将默认为“可抓取”,除非从开始功能中删除;
  5. Default Targeted Material:如果其可抓取目标材质为空,则将仅用于目标可抓取距离(目标是当指针指向对象但未选择时);
  6. Default Selected Material:如果其可抓取目标材质为空,则仅在选定的可抓取距离上使用(选择是指指针在拉动之前抓取对象时)。

Distance grabber(距离抓取器)包括“Pull Options 拉动选项”,它允许您选择“选择”后如何触发抓取:

  1. Use Instant Pull:将立即触发拉选;
  2. Use Flick Pull:将要求您在选择目标后迅速向后挥手以拉动;
  3. Pull Grab Distance:如果既不使用轻弹拉动也不使用即时拉动,则距离拉动将处于活动状态,这将在移动您的手时拉动选定的目标拉动抓取距离单位远离手在选择点期间的位置。

事件:

3.Distance Grabbable

为了使对象距离可抓取,每个 Grabbable 对象都需要一个 Distance Grabbable 组件。该组件将控制如何从远处抓取单个对象。
为了瞄准并激活 Distance Grabbables,您需要使用 Hand Distance Grabber,它应该连接在您的手/控制器下方。 (示例可以在演示场景的右手下找到)

该组件将允许您控制每个距离可抓取的抓取方式:

  1. Instant Pull 将使对象在 Pull 时立即出现在您的手中;
  2. Velocity Shoot将控制物体在拉动时如何向手发射,(仅当即时拉动未激活时才有可能)。

 4.Controller Input

管理手距指示器的开始/停止指向和开始/停止选择功能的输入。

六、Place Point

Place Point允许将抓取物放置在预定的点或区域中。默认情况下,当玩家在放置半径内释放物品时,如果该物品满足放置要求,放置点将接受该物品。

Place Settings:

  1. Start Placed:如果没有则留空,无论位置如何,都会自动将此对象放在开始位置;
  2. Placed Offset:代表放置点的中心。如果为空将默认为本地坐标;
  3. Placed Radius:是距允许放置的放置偏移的距离(半径);
  1. Parent on Place:如果为true,放置的可抓取物将在放置的偏移量下作为父级;
  2. Force Place:如果为true,无论物体是否被释放,放置点一进入放置区域就会自动放置一个可抓取物(满足放置要求);
  3. Force Hand Release:如果为 true,放置点将强制手将放置在放置点中的对象放下。即使这是错误的,如果手传送到离控制器太远或可抓取的破坏力太低,手有时会强制释放抓取到位。
  1. Destroy Object On Place:如果为真,放置的对象将被销毁;
  2. Disable Rigidbody On Place:如果为 true,放置的可抓取对象在放置在该位置点时将失去其刚体(再次抓取时会添加刚体);
  3. Disable Grab On Place:如果为 true,放置的可抓取物在放置到该位置点后将不再可抓取;
  4. Disable Place Point On Place:如果为真,放置对象后放置点将被停用,放置点将不再可用(除非重新启用)。
  1. Make Placed Kinematic:如果使用,这会将放置的物体刚体设置为在放置点时运动;
  2. Placed Joint Link:如果使用,这将在放置的对象和包含的刚体之间创建固定关节(不适用于 Make Place Kinematic);
  3. Joint Break Force:(如果使用放置的关节链接)在放置的关节链接上使用的关节破坏力。

Place Requirements:

  1. Name Compare Type:Name会将对象名称与地名和黑名单名称进行比较,以检查是否允许放置;Tag会将对象标签与地名和黑名单名称进行比较,以检查是否允许放置;
  2. Place Names:将尝试放置的对象(基于比较类型)与此列表中的所有Name/Tag进行比较,以查看是否允许放置它们。如果是名称比较,它将检查名称是否包含包含的单词,例如 blue 将允许放置名为 blue_car 的对象;
  3. BlackList:名称会将尝试放置的对象(基于比较类型)与此列表中的所有Name/Tag进行比较,以查看是否不允许放置它们。如果是名称比较,它将检查名称是否包含包含的单词,例如 car 将不允许放置名为 blue_car 的对象;
  1. Only Allows: 如果使用,place point 将只接受此列表中包含的可抓取物;
  2. Dont Allows:如果使用,放置点将不接受此列表中包含的可抓取物;
  3. Place Layers:只允许放置这些物理层中的对象。默认情况下,如果设置为 Nothing 将在启动时设置为 Grabbable。 (不建议设置为 Everything,因为它更昂贵)
  4. Held Place Only:如果为真,则仅当手握住或释放可抓取物时才允许放置。

事件:

  1. On Place:当有效放置时发生;
  2. On Remove:当放置的对象被抓取时发生;
  3. On Highlight:当有效对象在释放和放置之前进入放置区域时发生;
  4. On Stop Highlight:当有效对象离开放置区域时发生。

程序代码如下:

Place Points 也可以通过具有这些功能的代码进行管理:

//如果“CanPlace()”标志被清除并且当前没有放置任何东西,将接受一个可抓取的
placePoint.Place(Grabbable grabbable)

//如果它与当前 placeObject 匹配,则删除其中的内容
placePoint.Remove(Grabbable grabbable)

//地点点中当前地点对象的 Getter -> 如果没有则返回 null
placePoint.placedObject 

//地点点当前高亮对象的getter -> 如果没有则返回null
placePoint.highlightingObj

通过自定义脚本连接 Place Point 事件:

using UnityEngine;
using Autohand;

public class PlacePointEventTemplate : MonoBehaviour {
    public PlacePoint placePoint;

    void OnEnable() {
        placePoint.OnPlaceEvent += OnPlace;
        placePoint.OnRemoveEvent += OnPlace;
        placePoint.OnHighlightEvent += OnHighlight;
        placePoint.OnStopHighlightEvent += OnStopHighlight;
    }

    private void OnDisable() {
        placePoint.OnPlaceEvent -= OnPlace;
        placePoint.OnRemoveEvent -= OnPlace;
        placePoint.OnHighlightEvent -= OnHighlight;
        placePoint.OnStopHighlightEvent -= OnStopHighlight;

    }

    public void OnPlace(PlacePoint point, Grabbable grab) {
        //Stuff happens when placed
    }

    public void OnRemove(PlacePoint point, Grabbable grab) {
        //Stuff happens when placed was removed

    }
    public void OnHighlight(PlacePoint point, Grabbable grab) {
        //Stuff happens when placepoint was highlighted

    }

    public void OnStopHighlight(PlacePoint point, Grabbable grab) {
        //Stuff happens when placepoint was done highlighting
    }
}

七、Dispenser Point

分配点允许将可抓取物分配到预定的点或区域。分发点将获取场景中的对象或预制件,并允许玩家从该点获取该项目的副本
分配器将隐藏给定的源对象并分配副本。如果在重置时销毁被禁用,分配器将自动收集分配的对象,这是更优化的但不会总是给出预期的结果,例如:当为枪分配弹药时关闭重置销毁将导致已经使用的弹药一旦达到最大副本而不是全新的完整副本,就会分发。

Dispenser Setting:

  1. Dispense Object:要复制和分发的对象;
  2. Max Copies:在它们被销毁或汇集之前允许从该分配器存在的最大副本;
  3. Reset Delay:下一次分配出现之前的秒数;
  4. Disable Body:禁用Body;
  5. Is Kinematic:放置在分配点中的物体是否应设置为运动学;
  6. Destroy On Reset:如果为真,对象将不会被合并并在重置时重置其位置,它将被销毁并放置一个新副本。性能较差但对于弹药之类的东西很重要,弹药应该总是在新剪辑满时重生;
  7. Max Distance:在分配下一个物体之前,一个分配的物体可以从该点移动的最大距离。
  1. On Grab Dispense:当分配的对象被抓取时调用;
  2. On Dispense:当产生新的分配物品时调用。

程序代码如下:

通过自定义脚本连接 Dispenser Point 事件:

using UnityEngine;
using Autohand;

public class DispenserEventTemplate : MonoBehaviour {
    public DispenserPoint dispenserPoint;

    void OnEnable() {
        dispenserPoint.OnGrabDispenseEvent+= OnGrabDispense;
        dispenserPoint.OnDispenseEvent+= OnDispenseEvent;
    }

    private void OnDisable() {
        dispenserPoint.OnGrabDispenseEvent -= OnGrabDispense;
        dispenserPoint.OnDispenseEvent -= OnDispenseEvent;

    }

    public void OnGrabDispense(DispenserPoint point, Grabbable grab) {
        //Stuff happens when the dispensed grabbbale is grabbed
    }

    public void OnDispenseEvent(DispenserPoint point, Grabbable grab) {
        //Stuff happens when a new object is dispensed, references the new grabbable that appears in a dispenser

    }
}

八、Custom Poses

1.概述

有时自动生成的姿势不会削减它,您需要更多自定义或限制性的东西,例如:您总是希望用户通过手柄而不是杯身抓住茶杯。这就是 Grabbable Poses 派上用场的地方。
通过缓存手对象下每个变换的变换位置/旋转然后在激活姿势时应用这些位置来保存姿势。这意味着姿势是在每个Rig的基础上保存的,如果你有多只手有不同的Rig,你将不得不为每只手和每个姿势使用不同的姿势索引值将多个姿势保存到一个对象。这也意味着,如果您在后期制作中更改手部模型,则必须使用与旧手部相同的Rig或重新创建您的自定义姿势。
操作步骤视频链接:Autohand自定义手势教程_哔哩哔哩_bilibili

2.Grabbable Pose

适用于自动姿势系统无法生成的简单静态自定义姿势或您希望强制玩家始终拥有的姿势,例如武器、杯子或笔。对于更复杂的姿势,例如您想从任何角度抓住门把手或只想沿着或绕着抓住一根棍子,请使用Advanced Grabbable Pose。

可以将多个姿势添加到一个可抓取对象中。默认情况下,将选择最接近抓取时手相对Position和Rotation的姿势。

(可选)如果您有一个由多个碰撞器组成的对象,您可以为每个碰撞器添加一个 Grabbable,并为每个碰撞器附加一个不同的姿势。

  1. Pose Enabled:仅允许在 true 时使用姿势;
  2. Pose Name:用于组织目的,不是必需的;
  3. Pose Index:需要匹配手的姿势索引才能使该姿势起作用(这是为了允许多个手模型在一个可抓取的物体上保存不同的姿势)

 Advanced Settings:

  1. Position Weight:位置权重越高,在多个姿势之间做出决定时,根据手的距离优先考虑该姿势的次数越多;
  2. Rotation Weight:旋转权重越高,在决定多个姿势时,该姿势的优先级越高,基于手的距离;
  3. Linked Poses:此列表中的所有姿势只有在当前抓取该姿势时才会激活。适用于霰弹枪之类的东西,您只希望在扣住扳机时用第二只手抓住枪管。

Pose Scriptable:Pose Scriptable 用于在不同的可抓取姿势组件之间保存和传递姿势。可以通过在项目窗口中右键单击并选择Create/Auto Hand/Custom Pose,然后将其附加到可抓取姿势来创建Pose Scriptable的姿势。

Show Editor Tools:

当您将可编写脚本的姿势添加到抓取姿势时,将出现一个按钮提示,允许您使用保存在本地可抓取姿势上的姿势覆盖可编写脚本的姿势。
当您将保存的可编写脚本的姿势添加到可抓取的姿势时,它将优先于可编写脚本的姿势。

Pose Editor Hand:

您可以通过创建场景中现有一只手的手部副本来创建编辑器手部。

当您选择手副本时,您将看到这样的工具(如果启用了Gizmos),使用此工具摆出手的姿势,将手倒置到左/右相反的位置,并保存姿势。

注意:创建新姿势后记得删除手部副本。

注意:仅当选择了编辑器手并且启用了 Gizmos 时,场景视图上的 GUI。

3.Grabbable Pose Advanced

使用与Grabbable Pose相同的根设置。

该组件将沿着给定的角度和范围从保存姿势的点强制执行一个姿势,用于需要跨越严格的线和/或半径抓取的对象,如球棒手柄或方向盘。

  1. Center Object:可选覆盖姿势将旋转并在其范围内移动的枢轴点。对于具有不以手柄或线为中心的网格的对象很重要;
  2. Up:是您的高级姿势旋转的方向。由Transform或Center对象周围的白色圆盘表示;
  3. Use Invert Pose:将允许手在要使用的轴上旋转 180 度;如果在大拇指朝上、锤头朝上握锤的姿势上启用,它也将允许拇指朝上、锤头朝下的姿势保持;
  4. Angle:Transform或Center对象的局部向上方向周围允许的姿势;
  5. Range:沿Transform或Center对象的局部向上方向允许的姿势;
  6. Test Angle/Range:可用于测试姿势在特定角度下的样子。当值更改并启用小工具Gizmos时,它将更新活动编辑器手的位置。

4.Hand Pose Area

进入此对象的触发区域时,强制手采取保存的姿势。仅在未握住物体时激活 用于在手靠近某物时创建姿势,例如用食指按下的小按钮。

九、Animated Held Poses

操作步骤视频链接:AutoHand 手势动画_哔哩哔哩_bilibili

1.Grabbable Pose Animation

该组件将允许您通过按下扳机或挤压手柄在两个已保存的姿势之间制作一只手的动画。

它将采用一个From姿势和一个To姿势,并根据给定的动画驱动程序和动画曲线在两个姿势之间进行插值。

该组件附加到Demo场景中自动手持步枪下的“Handle”。

  1. Animation Curve:https://docs.unity3d.com/Manual/animeditor-AnimationCurves.html 应该从 0 到 1,如果您对动画曲线的理解没有信心,请将其保留为默认;
  2. Animation Driver:确定在握住姿势时激活此姿势的默认手值;
  3. From Pose:手的默认姿势(0);
  4. To Pose:手将移动以匹配给定动画驱动程序值(为 1)的姿势;
  5. Additional Animations:附加动画与给定的驱动程序值一起运行(适用于与手分离但仍需要在动画期间随手移动的枪扳机之类的东西)。

2.Auto Animation

该组件是 Grabbable Pose Animation 的帮助脚本,将与它连接的任何 Grabbable Pose Animations 一起播放。
该组件将保存它的本地Transform数据(如果启用了 Record Child Transforms,则保存该对象的子对象)。

该组件附加到演示场景中自动手持步枪下的“Trigger”。

  1. 使用 Save Start 将此对象的当前本地Position保存到此自动动画的开始;
  2. 使用End Start将这个物体当前的本地Position保存到这个动画的末尾;
  3. 使用 Set to 和 Set Test Value 来使用 0-1 测试动画的外观。

十、Teleportation传送

1.Teleporter

Teleporter会将传送对象传送到由瞄准器Transform和Distance强度/乘数指定的点。
如果传送对象为空,它将自动在场景中找到 Auto Hand Player 并使用它。

Teleport Settings:

  1. Teleport Object:传送到瞄准器的传送点的Transform;
  2. Additional Teleports:将与传送对象一起传送这些对象;

Aim Settings:

Aimer:指针对象。应该是手或控制器下的Transform。将它放在手指所在的手下方,让传送弧从指尖发出;

Layer:允许传送的图层;

Max Surface Angle:以度为单位传送的最大允许表面角度;

Distance Multiplier:拱门的距离;

Curve Strength:施加到传送拱门的向下力;

Line:拱门所需的线渲染器;

Can Teleport Color:击中有效的传送点时,线拱的颜色;

Cant Teleport Color:击中无效的传送点时,线拱的颜色;

Indicator:是一个表示传送点的对象,传送点将被设置为线拱击中位置或如果没有击中发生则隐藏。

Teleport Input:

管理 Teleporter Pointer 组件的控制器输入。

十一、Auto Hand Player

Auto Hand Player 是一个可选的刚体运动系统,与Auto Hand兼容。该系统包括smooth movement平稳移动、turning转弯、grounding接地、platforming平台、climbing攀爬和pushing推动。

  1. Head Camera:是被跟踪的VR相机;
  2. Forward Follow:是什么决定了你的运动轴的前进方向。推荐使用相机或控制器。使用相机作为正向transform:向前推动拇指杆将向相机面向的方向移动;
  3. Tracking Container:这应该是一个包含 Hands、Controllers、Tracked Camera 和 Fullbody(如果使用)的空对象。此跟踪容器不应放置在 Auto Hand Player 下,但应与 Auto Hand Player 位于同一父级下;
  4. Hand Right:玩家使用的右手;
  5. Hand Left:玩家使用的左手。

Movement:

  1. Max Move Speed:运动可以达到的最大速度;
  2. Move Acceleration:玩家加速以匹配目标移动速度的速率。如果您希望玩家在开始向下移动时立即达到最大速度以在开始和停止移动之间进行较慢的转换,请将其调高;
  3. Grounded Drag:玩家着陆时要应用的阻力量。这将作为某人站立在地面上与在施加力时跌倒时的额外刚度;
  4. Height Smooth Speed:走上楼梯或坡道时会发生高度平滑。高度平滑速度有助于用更平滑的步骤代替 VR 中不和谐的高度变化,就像走路时发生的那样。

Snap Turning:

关闭快速转向切换将启用平滑转向并显示平滑转向速度。

  1. Snap Turning Angle:绕 y 轴旋转的角度,输入 0-360;
  2. Smooth Turn Speed:平稳的转弯速度。

Height:

  1. Height Offset:取正值或负值,并将玩家的身高抵消该数量;
  2. Crouching:可切换,启用/禁用时将减少/增加蹲伏高度;
  3. Crouch Height:启用蹲伏时降低玩家的高度;
  4. Auto Adjust Collider Height:如果为真,本地CapsuleCollider将自动调整其高度以匹配头部高度;
  5. Min Max Height:CapsuleCollider的最小最大高度。有助于防止玩家到达他们不应该在地板上爬行或最大化他们的高度的地方;
  6. Use Head Collision:头部摄像头是否应该使用碰撞来防止摄像头穿过物体。头部将与身体发生相同的碰撞;
  7. Head Radius:头部碰撞半径。

Grounding:

您可以禁用接地以启用飞行。
接地将使玩家锁定在地面上。它管理着爬上斜坡和楼梯。

  1. Max Step Height:最大允许台阶高度;
  2. Max Step Angle:允许行走的最大表面角度:0 是平坦的,45 是半角斜坡 70 是非常陡的斜坡,90 是垂直表面;
  3. Ground Layer Mask:只有在接触这些物理层中的物体时才会发生接地。

Climbing:

如果在 Auto Hand Player 上启用了攀爬,并且玩家手持带有可攀爬组件的抓取物,攀爬将被激活。当攀爬被激活时,玩家的身体将尝试移动以填补控制器和手之间的差异。

  1. Allow Climbing Movement:如果为真,则玩家可以在激活攀爬时使用摇杆移动
  2. Climbing Strength:通过此 vector3 缩放目标速度;
  3. Climbing Acceleration:速度可以多快移动到目标速度(防止抖动,不要转得太高);
  4. Climbing Drag:应用于玩家身体的阻力。

爬到可抓取的物体上以激活攀爬,攀爬也可以通过连接的stabber激活。

Pushing:

与攀爬类似,但通过与具有 Pushable 组件的对象的手碰撞激活。不建议在动态对象上推送。

  1. Pushing Strength:通过此 vector3 缩放目标速度;
  2. Pushing Acceleration:速度可以多快移动到目标速度(防止抖动,不要转得太高);
  3. Pushing Drag:应用于玩家身体的阻力。

 

继续一个对象以激活用手碰撞推动。

Platforming:

如果启用,Auto Hand 玩家将自动平台化它当前接地的任何地面,该地面也存在于平台层蒙版中。平台将移动/旋转Player,无论它站在什么地方。

 Platforming Layer Mask:物理层以启用自动平台化。

Jumping:

Auto Hand Player 脚本包括一个简单的 Jump 函数,该函数通过暂时禁用接地并向玩家刚体施加向上的速度力来工作。

AutoHandPlayer player = GetComponent<AutoHandPlayer>();
player.Jump(strength);

Controller Input:

十二、Full Body(VRIK)

此功能依赖Final IK插件。

Demo:

在 Auto Hand/Packages/FinalIK 中下载 VRIK 演示。
这将在 Auto Hand/Examples/Scenes/FinalIK (Full Body) 中下载一个新文件夹。

安装指南:

(1)遵循 VRIK 设置指南;

(2)按照设置新手教程,为您装备上的每个手腕添加一只手。

重要提示:确保将手放在骨架Rig的手腕上。

(3)3. 将 Auto Hand VRIK 组件添加到包含 VRIK 组件的主体,并附加您在​​步骤 2 中设置的手,在跟踪的 VR 控制器下添加空transform,并将它们连接到 Auto 上的右跟踪控制器和左跟踪控制器值手部VRIK。

您可以通过移动控制器下的空transfom来偏移手的位置。

当同时使用Auto Hand Player时,确保将身体放在与头部摄像头和控制器相同的容器下。

  1. Right Hand: 手腕Rig上的右手设置;
  2. Left Hand:手腕Rig上的左手设置;
  3. Right Tracked Controller:是手应该跟随的控制器。这些应该是右控制器下的空物体,可用于将手偏移到理想位置;
  4. Left Tracked Controller:是手应该跟随的控制器。这些应该是左侧控制器下方的空对象,可用于将手偏移到理想位置。

十三、 Grabbable Held Joint 可抓握关节

该组件可用于在单个刚体结构中创建稳定的固定关节。由具有相同刚体和每个碰撞器上的不同可抓取组件的多个碰撞器组成的对象,可以使用此保持的关节来创建仅在被保持时活动的线性关节。
这通常比传统的刚体关节稳定得多,并且在被迫进入静态表面时不会遇到问题。适用于枪套之类的东西。

  1. Connected Grabbable:这个 grabbable 连接到的 grabbable;
  2. Pivot Offset:偏移这个关节的中心;
  3. Held Mass Scale:这将增加手的力量,同时握住这个可抓握的物体,以在将此关节作为二手手握住时赋予它或多或少的位置优先权(当您不希望此关节在被握住时具有移动优先权时,可以减少);
  4. Max Limit:允许此关节在局部正轴上移动的最大距离;
  5. Min Limit:允许此关节在局部负轴上移动的最大距离;
  6. Spring:这将根据给定的弹簧强度迫使关节回到其中心位置,而不是沿该轴保持;
  7. Event Offset:触发事件所需的最小/最大距离的百分比,有助于为事件创建缓冲区以在最大范围之前稍稍触发以帮助防止错过事件。

十四、Gadgets(Levers,Dials) 小工具(杠杆、刻度盘)

Physics Gadget 物理小工具:

物理小工具都是使用不同的方法或读取物理关节位置/角度来创建模拟按钮、杠杆和滑块的事件。

这些组件是用户友好的界面,使用 Unity Events 允许在不创建额外代码的情况下调用事件和方法(就像 Unity 的 UI 按钮) 。

任何具有足够力量将关节推过阈值的碰撞都可以触发小工具。
您可以通过在开始时将小工具的刚体设置为 isKinematic 然后通过 grabbables OnGrab 事件禁用 isKinematic 来使物理小工具仅在被抓取时才可交互。

Physics Gadget Button:

该组件需要一个可配置的关节。按钮的物理特性将由可配置的关节和刚体决定。
可以由任何具有足够力量将可配置关节推过阈值的碰撞触发。
类似于无需物理即可工作的 Hand Touch / Trigger。

  1. Invert:反转触发值;
  2. Play Range:Player范围是距离目标值的量对于稍微偏离中心的对象(如果Play范围为 0.1,则返回值非零值所需的最小绝对值,您必须将小工具移动 10% 以获得结果);
  3. Threshold:阈值是调用事件所需的所需值的百分比 (0-1)(如果阈值为 0.1,将在 0.9 时调用 OnMax,在 -0.9 时调用 OnMin,在 -0.1 或 0.1 时调用 OnMiddle);
  4. Lock On Pressed:按下时是否将按钮锁定在 On 位置。

Physics Gadget Lever:

该组件需要一个 Hinge Joint 和一个 Rigidbody,杠杆的物理特性将通过这些组件进行设置。基于铰链关节限制的 OnMax、OnMin 事件。

调整刚体的质量和/或阻力以使其更难推动。

  1. Invert:反转触发值;
  2. Play Range:Play范围是距离目标值的量对于稍微偏离中心的对象(如果Play范围为 0.1,则返回值非零值所需的最小绝对值,您必须将小工具移动 10% 以获得结果)
  3. Threshold:阈值是调用事件所需的所需值的百分比 (0-1)(如果阈值为 0.1,将在 0.9 时调用 OnMax,在 -0.9 时调用 OnMin,在 -0.1 或 0.1 时调用 OnMiddle);
  4. Step Count:步骤确定杠杆将停止在哪些部分。 0 不会创建步骤,只使用联合设置。 2 仅将小工具锁定为开/关。 100 将在您释放它的地方停止小工具;
  5. Start Step:杠杆应该开始的步骤;
  6. On Max Event:根据可配置的关节限制减去阈值触发此事件;
  7. On Mid Event:此事件是根据可配置的关节限制减去游隙触发的;
  8. On Min Event:根据可配置的关节限制减去阈值触发此事件;
  9. On Step Event:当小工具沿着关节范围击中给定步时,将触发此事件。

Physics Gadget Slider:

该组件需要一个Configurable Joint,滑块的物理特性也将通过该可配置关节和刚体进行设置。

  1. Invert:反转触发值;
  2. Play Range:Play范围是距离目标值的量对于稍微偏离中心的对象(如果Play范围为 0.1,则返回值非零值所需的最小绝对值,您必须将小工具移动 10% 以获得结果);
  3. Threshold:阈值是调用事件所需的所需值的百分比 (0-1)(如果阈值为 0.1,将在 0.9 时调用 OnMax,在 -0.9 时调用 OnMin,在 -0.1 或 0.1 时调用 OnMiddle);
  4. Step Count:步骤确定杠杆将停止在哪些部分。 0 不会创建步骤,只使用联合设置。 2 仅将小工具锁定为开/关。 100 将在您释放它的地方停止小工具;
  5. Start Step:杠杆应该开始的步骤;
  6. On Max Event:根据可配置的关节限制减去阈值触发此事件;
  7. On Mid Event:此事件是根据可配置的关节限制减去游隙触发的;
  8. On Min Event:根据可配置的关节限制减去阈值触发此事件;
  9. On Step Event:当小工具沿着关节范围击中给定步时,将触发此事件。

十五、UI Interaction

Hand Canvas Pointer:

通过单击和滑动模拟光标,以便在 VR 中与 Unity Canvas UI 进行交互。

Canvas 需要 Graphics Raycaster 组件。
应该在手或控制器下进行空transform。需要一个线渲染器,它会在与 UI 交互时自动显示/隐藏。 

  1. Hit Point Marker:是一个对象,仅当针对 UI 时才会出现并匹配目标 UI 的命中位置和法线;
  2. Raycast Length:UI指针的最大长度;
  3. Auto Show Target:是您是否应该指向或指向并单击以激活指针;
  4. UI Layer:是指针可以指向的物理层。

事件:

  1. Start Select:当主动指向有效的 UI 时调用,并调用 HandCanvasPointer.Press() 函数;
  2. Stop Select:当主动指向有效的 UI 时调用,并调用 HandCanvasPointer.Release() 函数;
  3. Start Point:当开始指向一个有效的 UI 时调用;
  4. Stop Point:当停止指向有效的 UI 时调用。

Controller Input:

带有附加到控制器操作的 Unity 事件的通用脚本。

Advanced Information:

在启动时,此组件将生成一个相机(它不会渲染或创建额外的图形开销)设置场景中的每个画布以使用该相机进行 UI 交互,并销毁任何其他事件系统。
该系统不能同时兼容桌面UI交互或场景中的附加事件系统。

十六、Hand Touch/Trigger

Hand Touch Event:

Hand Touch Events 通过将此组件添加到任何刚体的根部来工作,并且当手开始/结束接触对象时将调用这些事件。该组件对与手的实体碰撞做出反应 (OnCollisionEnter),使用手触发区域对触发碰撞器中的对象进行反应。

  1. One Handed:此触摸对象是否一次只能与一只手交互;
  2. Hand Type:允许哪只手激活此触摸事件。

Events:

  1. Hand Start Touch:当没有手接触这个并且一只手开始接触这个时会触发;
  2. Hand Stop Touch:当所有的手都不再接触这个时会触发。

Hand Trigger Area:

Hand Trigger Area Events 通过将此组件添加到任何刚体的根部来工作,并且当手开始/结束进入对象触发区域时将调用这些事件,但这也会在手在内部时跟踪抓取和挤压事件触发区。

  1. One Handed:此触摸对象是否一次只能与一只手交互;
  2. Hand Type:允许哪只手激活此触摸事件;
  3. Exit Trigger Release:如果手在离开该区域时握着扳机,即使扳机未被释放,是否应调用扳机释放事件;
  4. Exit Trigger:如果手在离开该区域时握住扳机,即使扳机没有松开,是否应该调用扳机释放事件。

事件:

  1. Hand Enter:当手进入这个触发区域时触发;
  2. Hand Exit:当手离开这个触发区域时触发;
  3. Hand Grab:当手在这个触发区域抓住时触发;
  4. Hand UnGrab:当手在该触发区域中松开时触发(或在启用退出触发释放的情况下退出);
  5. Hand Squeeze:当手在此触发区域挤压时触发;
  6. Hand Unsqueeze:当在此触发区域中手动解开时,触发时(或带出启用退出触发启用的退出)。

十七、Smashing 粉碎

Smashable:

Smash 组件需要进入要使其可粉碎的刚体对象。

  1. Smash Force:是 Smasher 刚体撞击触发 On Smash 事件所需的力;
  2. Destroy on Smash:是否在粉碎时销毁此对象;
  3. Effect:是否在粉碎时创建粒子效果;
  4. Create New Effect:是否应该创建效果的副本或触发本地效果;
  5. Apply Velocity On Smash:是否在粉碎时应用粉碎对象的局部速度。

Smasher:

Smasher 组件需要放在刚体上。当它的速度 * 多力满足 Smash 的粉碎力时,该组件将触发带有 Smash 组件的刚体。

  1.  Force Multi:更高的力倍增器将降低粉碎器触发粉碎对象所需的速度;
  2. Center of Mass Point:是计算物体速度的地方。例如,在锤头中心放置一个空物体以获得更好的粉碎效果。

十八、Stabbing刺穿

Stabbing(Early Release):

Stabber 组件将能够使用匹配的刺入索引刺入任何进入其Capsule Collider/Trigger的 Stabbable。关节设置基于Configurable Joint设置。

Stabber:

当 Stabber 与 Stab Capsule 重叠时,Stabber 继续抓取并与 Stabbable 创建一个关节。

  1. Stab Capsule:是决定Stabber的触发能力。这个Capsule必须积极地重叠一个Stabbable的物体来触发和维持一个Stab;
  2. Stabbable Layers:可以发生刺穿的物理层。如果设置为空将默认为可抓取;
  3. Stab Index:必须与可刺物体上的stab指数相匹配才能激活stab;
  4. Max Stabs:这个stabber可以同时执行的最大stab次数;
  5. Joint Settings:这些确定了生成的Configurable Joint的设置;
  6. Limit:表示stabber可以进入Stabbable的距离;
  7. Position Dampening Multiplier:将这个物体推过可刺穿需要多大的力;
  8. Rotation Dampening Multiplier:旋转这个物体需要多大的力。

Stabbable:

  1. Stab Index:必须与可刺物体上的刺指数相匹配才能激活刺;
  2. Max Stabs:这个刺刀可以同时执行的最大刺刀次数;
  3. Position Dampener:将这个物体推过可刺穿需要多大的力;
  4. Rotation Dampener:旋转这个物体需要多大的力;
  5. Parent On Stab:刺伤时是否将此对象作为玩家的父级以创建与玩家/传送的平滑移动。应为小型动态对象启用,为大型或静态对象禁用。

十九、Stickies 粘住

Stickable:

具有此组件的刚体在与sticky粘性组件发生碰撞时会创建连接。

  1. Stick Strength: 断开 Sticky 和 ​​Stickable 之间的连接所需的额外力的大小;
  2. Stick Speed Multiplier:该值越高,Stickable 粘贴有效 Sticky 所需的速度越慢;
  3. Stick Index:必须与 Sticky 上的棒索引相匹配才能获得有效的棒。

Sticky:

具有此组件的刚体在与可粘组件发生碰撞时会创建连接。

  1. Stick Strength: 断开 Sticky 和 ​​Stickable 之间的连接所需的额外力的大小;
  2. Required Stick Speed:该值越高,被可粘性物体击中时所需的速度就越大;
  3. Stick Index:必须与 Sticky 上的棒索引相匹配才能获得有效的棒。

二十、Magnetic Forces 磁力

Magnetic Source:

这将创建一个区域,在该区域中,任何具有Magnetic Body磁体组件的刚体都会根据其效果、强度和力距离曲线在该区域中使用刚体力连续拉动或推动该物体。

  1. Magnetic Effect: 给半径内的物体施加什么样的力;
  2. Attractive:将磁性体拉向中心;
  3. Repulsive:将磁性体推离半径;
  4. Strength:对磁体施加多大的力;
  5. Radius:源的半径(受比例影响);
  6. Force Mode:施力时使用哪种力模式;
  7. Force Distance Curve:根据距中心的距离除以半径施加的力,曲线 x 范围应保持在 0-1 之间。一条从 0-1 上升的线将在力区边缘具有更高的力,而在中心具有更少的力。无论在半径内的距离如何,一条平坦的线将具有一致的力;
  8. Magnetic Index:必须匹配磁体的磁指数才能施加力。

 

  1. Magnetic Index:必须与磁源的磁指数相匹配才能施加力;
  2. Strength Multiplyer:将放大施加到该物体上的磁源的力。

二十一、Collision Sounds碰撞声

该组件将在与碰撞触发器蒙版中的任何层发生碰撞时使用速度体积曲线播放源剪辑。

  1. Collsion Triggers: 可以触发此碰撞声音的碰撞层;
  2. Source:播放声音的音频源;
  3. Clip:碰撞时播放的音频片段;
  4. Velocity Volume Curve:速度体积曲线用于根据碰撞力计算碰撞体积。体积曲线不需要介于 1x1 之间。x 是(速度幅度 * 速度放大器),y 是体积。
    最终体积用体积曲线*体积放大器计算;
  5. Volume Amp:体积倍增器;
  6. Velocity Amp:降低发出声音所需的速度;
  7. Sound Repeat Delay:防止Player快速连续发出声音。

二十二、Wrist Look Event 手腕事件

Wrist Look Event 可以添加到任何transform中,并且会在手背朝向给定相机并且在给定的最大距离和角度精确度范围内时触发。

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林枫依依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值