HandGrabInteractor prefabを通じてそれぞれの手にリンクされます。ハンドグラブインタラクタブルは、各Grabbableオブジェクトにリンクされます。これらの2つのコンポーネントがやり取りして、ハンドグラブインタラクションが発生したかどうかと、インタラクションがどのように動作するべきかを決定します。HandGrabInteractor prefabを通じて手にリンクされます。HandGrabInteractorは、最適なHandGrabInteractable候補を検索します。HandGrabInteractableのHand Alignmentプロパティを使い、IHandGrabStateを実装することによって、合成の手とインタラクタブルが視覚的に一致するようにします。HandGrabAPIやSupportedGrabTypesなどの一部の主要コンポーネントについては、この後のセクションで説明します。ここでは、任意のGripPointとPinchPointに関する注意事項について触れておきます。HandGrabInteractableは、オブジェクトをつかめるかどうかだけでなく、そのオブジェクトをインタラクターでどのように動かせるか、グラブ操作の開始と終了にどの指を使うか、オブジェクトと手の位置合わせをどのように行うかを示します。HandGrabInteractableでは、最適なグラブポイントを見つける戦略を指定するために、スコア修飾子パラメーターを使います。| プロパティ | 説明 |
|---|---|
Thumb, Index, Middle, Ring, Max (pinky) (親指、人差し指、中指、薬指、マックス(小指)) | グラブをトリガーするために各指が必要かどうかを決定します。[Required (必須)]、[Optional (任意)]、[Ignored (無視)]のいずれか。グラブ動作がトリガーされるには、[Required (必須)]のマークが付いたすべての指がジェスチャーを実行していなければなりません。どの指にも[Required (必須)]マークがない場合、グラブ動作がトリガーされるには、[Optional (任意)]のマークの付いた少なくとも1つの指がジェスチャーを実行していなければなりません。[Ignored (無視)]のマークが付いた指は、完全に無視されます。 |
Unselect Mode (選択解除モード) | グラブがいつ終了するかを決定します。[All Released (すべて放す)]または[Any Released (いずれかを放す)]のいずれか。[All Released (すべて放す)]モードの場合、必須の指と任意の指のすべてを放した時点でグラブが終了します。[Any Released (いずれか1つを放す)]モードの場合、必須の指のうちの少なくとも1つを放した時点でグラブが終了します。必須の指がない場合、任意の指のうち少なくとも1つを放した時点でグラブが終了します。 |


HandGrabInteractableによっても指定できます。例えば、グラブは親指と中指か人差し指とでピンチ操作を行った時点、または薬指と中指を曲げて手のひらグラブが引き起こされた時点で、グラブをトリガーすることができます。それらの指のいずれかまたはすべてを放すことでグラブが終了するように設定できます。
HandGrabInteractableで複数のHandGrabPoseが指定されている場合、それらの間の補間が、インタラクタブルによってLocalScaleと手のスケールに基づいて行われます。この方法では、わずかに異なるスケール(1倍、0.8倍、1.2倍など)で、わずかに異なるHandPoseによるHandGrabPoseを生成できるため、ユーザーの手とオブジェクトの視覚的な位置合わせを正確に行えます。または、FixedScaleHandを使って、ユーザーの手のスケールを固定値に保つこともできます。HandGrabAPIです。これは、IHandがグラブ操作をいつ開始し停止したかに加え、グラブポーズの強さを示します。HandGrabAPIが動作するために、IFingerAPIの2つの実装が使われます。デフォルトで、ピンチグラブ用にFingerPinchGrabAPIが使われ、手のひらグラブ用にFingerPalmGrabAPIが使われます。ただし、それ以外のAPIも使うことができます。例えばコントローラー駆動の手を使う場合には、FingerRawPinchAPIが便利です。HandGrabInteractorごとに、サポートするGrabTypesを指定することができます。ピンチ操作か手のひら、またはその両方が可能です。さらに、HandGrabInteractableでは、グラブ操作に必要なGrabTypesを指定できます(ピンチ操作専用のインタラクタブルを、手のひら専用のインタラクターによってグラブすることはできません)。これらは、インタラクタブルのグラブルールとともに使用されます。HandGrabAPIをそのまま使うことができます。その場合、測定対象の曲線値はアニメーションハンドから直接読み取られます。しかし推奨されるのは、HandGrabAPIとともにFingerRawPinchInjectorコンポーネントを使う方法です。その場合、値がコントローラーの提供するピンチ値から直接読み取られるため、インタラクションの信頼性が高くなります。HandGrabStateVisualコンポーネントは、指関節の回転に制約を課すことにより、HandGrabインタラクションによってつかんだオブジェクトの周囲を指で完全に包んでいるように見えるようにします。また、このコンポーネントは、手の位置合わせがAttractOnHoverになっているHandGrabInteractableに向かって引き寄せられる手の手首ポーズもオーバーライドできます。HandGrabInteractableコンポーネントで設定されます。Grabbableコンポーネントで設定します。HandGrabInteractableに動作プロバイダーコンポーネントを接続して、グラブターゲットポーズの補間方法をカスタマイズします。動作プロバイダーが添付されていない場合、デフォルトでMoveTowardsTargetProviderが使われます。| プロバイダー | 動作 |
|---|---|
MoveTowardsTargetProvider | 設定可能なアニメーションの曲線により、インタラクタブルをインタラクターターゲットに向かって変化させます。デフォルトの移動時間は0.1秒で、ease-in-outイージングを使用します。これがデフォルトの動作です。 |
MoveFromTargetProvider | 現在のインタラクターポーズにインタラクタブルをアンカーします。補間は行いません。オブジェクトが1:1で即座にトラッキングします。制約のあるインタラクタブルの場合に役立ちます。 |
FollowTargetProvider | インタラクタブルをインタラクターターゲットに向かって一定の速度で連続的に移動させます。デフォルトの速度は1秒あたり5ユニットです。 |
IMovementProviderインターフェイスを実装し、それをインタラクタブルに接続することにより、カスタムの動作プロバイダーを作成することもできます。インターフェイスには、フレームごとのポーズの補間方法を制御するIMovementインスタンスを返す単一のCreateMovement()メソッドが必要です。GrabbableコンポーネントのTransformerは、各フレームでオブジェクトの位置がどのように更新されるかをコントロールします。Transformerは、つかんでいるオブジェクトが物理演算と相互作用するかどうかを決定します。| Transformer (トランスフォーマー) | 更新方法 | 物理演算との相互作用 | 一般的な用途 |
|---|---|---|---|
GrabFreeTransformer | transform.positionとtransform.rotationを直接設定する | なし。オブジェクトはコライダーと衝突します。 | デフォルト。安定した低遅延のトラッキングを提供します。 |
GrabFreePhysicsTransformer | FixedUpdate内のRigidbody.velocityとRigidbody.angularVelocityを設定する | あり。オブジェクトは他のオブジェクトと衝突し、物理演算に反応します。 | 物理パズル、ブロックを表面に押し付けます。 |
TwoGrabRotateTransformer | 2つのグラブポイントの間の方向に基づいて、指定された軸を中心にオブジェクトを回転させます。 | なし。回転は、2つのつかむ動作の形状から計算されます。 | ハンドル、バルブ、両手による回転コントロール。 |
GrabFreeTransformerが使われます。物理シミュレーションを必要としないほとんどのグラブインタラクションでは、デフォルトの設定で十分です。GrabFreePhysicsTransformerでは、以下の調整パラメーターが公開されています。OneGrabPhysicsJointTransformerはデフォルトで無限の破断荷重を加えるFixedJointを使用します。特定の軸に沿った動きを制限するには、変換ツールにカスタムConfigurableJointを割り当てます。Grabbableコンポーネントは、つかんでいる間とつかんだ後の物理的な動作に影響するフィールドを提供します。| フィールド | デフォルト | 説明 |
|---|---|---|
Kinematic while selected (選択中はキネマティック) | true | グラブ中にRigidBodyをキネマティックに設定する |
Throw when unselected (選択解除時にスローする) | true | リリース時に投げる速度を適用する |
Force kinematic disabled (キネマティックを強制的に無効にする) | false | キネマティックとして開始されたオブジェクトを投げる際に、 isKinematic = falseを強制します。 |
GrabFreePhysicsTransformerを使用する場合は、選択した状態でキネマティックをfalseに設定してください。デフォルトの値trueでは、Rigidbodyがキネマティックモードにロックされ、速度と力ベースの更新が適用されなくなります。物理ベースの変換ツールに切り替えた後にオブジェクトが正しくトラッキングされない場合、通常はこの原因が考えられます。| シナリオ | Transformer (トランスフォーマー) | Kinematic while selected (選択中はキネマティック) | Throw when unselected (選択解除時にスローする) | Force kinematic disabled (キネマティックを強制的に無効にする) |
|---|---|---|---|---|
つかんで保持する | GrabFreeTransformer (デフォルト) | true (デフォルト) | true | false |
物理パズル(ブロックを押す) | GrabFreePhysicsTransformer | false | false | false |
スローできるボール | GrabFreeTransformer (デフォルト) | true (デフォルト) | true | true |
ヒンジのついたドア | OneGrabPhysicsJointTransformer + ConfigurableJoint | false | false | false |
GrabFreeTransformerが最も安定したトラッキングを提供します。スロー可能なオブジェクトに対して、[Force kinematic disabled (キネマティックを強制的に無効にする)]を有効にします。これにより、リリース時にRigidbodyが非キネマティックに切り替わります。これにより、オブジェクトが元々キネマティックであったとしても、投げる際の速度が反映されるようになります。GrabFreePhysicsTransformerを使用し、[Kinematic while selected (選択中はキネマティック)]をfalseに設定して、つかんでいる間もRigidbodyが力に反応できるようにします。ハンドルやバルブのような両手の回転コントロールには、設定された回転軸と角度制限のTwoGrabRotateTransformerを使用します。