Unity のモーション コントローラー

HoloLens およびイマーシブ HMD において、Unity の視線入力手のジェスチャ、およびモーション コントローラーに対してアクションを実行する 2 つの主要な方法について説明します。 Unity の同じ API を使用して、空間入力の両方のソースのデータにアクセスします。

Unity では、Windows Mixed Reality の空間入力データにアクセスする主な方法を 2 つ提供しています。 共通の Input.GetButton/Input.GetAxis API は、複数の Unity XR SDK に対して機能します。一方、Windows Mixed Reality に固有のInteractionManager/GestureRecognizer API は、空間入力データの完全なセットを公開します。

Unity XR 入力 API

新しいプロジェクトの場合は、最初から新しい XR 入力 API を使用することをお勧めします。

XR API の詳細についてはこちらを参照してください。

Unity ボタン/軸マッピング テーブル

Unity の Input Manager for Windows Mixed Reality モーション コントローラーでは Input.GetButton/GetAxis API を使用して、以下に示すボタンと軸の ID がサポートされています。 "Windows MR 固有" 列は、InteractionSourceState 型から使用できるプロパティを参照します。 これらの各 API については、以下のセクションで詳しく説明します。

Windows Mixed Reality のボタン/軸 ID マッピングは、通常は Oculus ボタン/軸 ID と一致します。

Windows Mixed Reality のボタン/軸 ID マッピングは、2 つの点で OpenVR のマッピングとは異なります。

  1. このマッピングでは、サムスティックとは異なるタッチパッドの ID を使用して、サムスティックとタッチパッドの両方を持つコントローラーをサポートします。
  2. マッピングを使用すると、メニュー ボタンの A ボタンと X ボタンの ID をオーバーロードして、物理 ABXY ボタンで使用できるようになります。
入力一般的な Unity API
(Input.GetButton/GetAxis)
Windows MR 固有の入力 API
(XR.WSA.Input)
左手 右手
押されたトリガーの選択 軸 9 = 1.0 軸 10 = 1.0 selectPressed
トリガーのアナログ値を選択する 軸 9 軸 10 selectPressedAmount
部分的に押されたトリガーを選択する ボタン 14 (ゲームパッドのパターン) ボタン 15 (ゲームパッドのパターン) selectPressedAmount > 0.0
メニュー ボタンが押された状態 ボタン 6* ボタン 7* menuPressed
グリップ ボタンが押された状態 軸 11 = 1.0 (アナログ値なし)
ボタン 4 (ゲームパッドのパターン)
軸 12 = 1.0 (アナログ値なし)
ボタン 5 (ゲームパッドのパターン)
つかんだ状態
サムスティック X (左: -1.0、右: 1.0) 軸 1 軸 4 thumbstickPosition.x
サムスティック Y (上: -1.0、下部: 1.0) 軸 2 軸 5 thumbstickPosition.y
サムスティックが押された状態 ボタン 8 ボタン 9 thumbstickPressed
タッチパッド X (左: -1.0、右: 1.0) 軸 17* 軸 19* touchpadPosition.x
タッチパッド Y (上: -1.0、下部: 1.0) 軸 18* 軸 20* touchpadPosition.y
タッチパッドがタッチされた状態 ボタン 18* ボタン 19* touchpadTouched
Touchpad pressed ボタン 16* ボタン 17* touchpadPressed
6DoF のグリップの姿勢またはポインターの姿勢 Grip 姿勢のみ: XR.InputTracking.GetLocalPosition
XR.InputTracking.GetLocalRotation
引数 としてグリップ またはポインターを渡す: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
追跡状態 位置の精度とソース損失のリスクは、MR 固有の API を通じてのみ利用できます sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Note

これらのボタン/軸の ID は、ゲームパッド、Oculus Touch、OpenVR で使用されるマッピングの競合により、Unity が OpenVR に使用する ID とは異なります。

OpenXR

Unity での Mixed Reality の対話式操作の基本については、Unity XR 入力の Unity マニュアルに関するページを参照してください。 この Unity ドキュメントでは、コントローラー固有の入力から、より汎用的な InputFeatureUsageへのマッピング、使用可能な XR 入力を識別して分類する方法、これらの入力からデータを読み取る方法などについて説明します。

OpenXR Mixed Realityでは、次に示す標準 の InputFeatureUsage にマップされた追加の入力対話式操作プロファイルが提供されます。

InputFeatureUsage HP Reverb G2 コントローラー (OpenXR) HoloLens ハンド (OpenXR)
primary2DAxis ジョイスティック
primary2DAxisClick ジョイスティック - クリック
トリガー (trigger) トリガー
グリップ グリップ エア タップまたは絞り
primaryButton [X/A] - 押す エアタップ
secondaryButton [Y/B] - 押す
gripButton グリップ - 押す
triggerButton トリガー - 押す
menuButton メニュー

グリップ姿勢とポイント姿勢

Windows Mixed Reality は、さまざまなフォーム ファクターでモーション コントローラーをサポートします。 各コントローラーの設計では、ユーザーの手の位置と、コントローラーのレンダリング時にアプリが指す必要がある自然な "前方" 方向との間の関係が異なります。

これらのコントローラーをより適切に表現するために、対話式操作の情報源ごとに調査できるグリップ姿勢ポインター姿勢という 2 種類の姿勢があります。 グリップ 姿勢とポインター姿勢の両方の座標は、グローバル Unity ワールド座標内のすべての Unity API によって表されます。

グリップ姿勢

グリップ姿勢は、HoloLens によって検出された手のひらか、モーション コントローラーを持つ手のひらのいずれかの位置を表します。

イマーシブ ヘッドセットでは、グリップ姿勢はユーザーの手や、ユーザーが手に持っているオブジェクトをレンダリングするのに最適です。 グリップ姿勢は、モーション コントローラーを視覚化するときにも使用されます。 モーション コントローラー用に Windows によって提供されるレンダリング可能なモデルでは、グリップ姿勢がその原点および回転の中心として使用されます。

グリップ姿勢は次のように明確に定義されます。

  • グリップ位置: コントローラーを自然に持ったときの手のひらの重心。グリップ内で位置を中央に合わせるために左または右に調整されます。 Windows Mixed Reality のモーション コントローラーでは、この位置は通常、つかむボタンに合わせて調整されます。
  • グリップの向きの右方向の軸: 手を完全に開いて 5 本の指が平面になる姿勢をとったときの手のひらに垂直な光線 (左手の手のひらからは前向き、右手の手のひらからは後ろ向き)
  • グリップの向きの前方向の軸: (コントローラーを持つように) 手を部分的に閉じたとき、親指以外の指で形成される筒形を通って "前方" をポイントする光線。
  • グリップの向きの上方向の軸: 「右」と「前」の定義から暗黙的に指定される上方向の軸。

グリップ 姿勢には、Unity のベンダー間入力 API (XR.InputTracking.GetLocalPosition/Rotation) または Windows MR 固有の API (グリップノードの姿勢データを要求する sourceState.sourcePose.TryGetPosition/Rotation) を使用してアクセスできます。

ポインター姿勢

ポインター姿勢は、前方を指しているコントローラーの先端を表します。

システムで提供されているポインター姿勢は、コントローラー モデル自体をレンダリングするときにレイキャストに最もよく使用されます。 コントローラーの代わりに、仮想的な銃など他の仮想オブジェクトをレンダリングする場合は、その仮想オブジェクトの最も自然な射線で指示する必要があります (たとえば、アプリ定義の銃モデルの銃身に沿って進む光線など)。 ユーザーは物理コントローラーではなく仮想オブジェクトを見ることができるため、アプリを使用する人にとっては仮想オブジェクトでポイントする方がおそらく自然になります。

現在、ポインターの姿勢は、Windows MR 固有の API sourceState.sourcePose.TryGetPosition/Rotation を通じてのみ Unity で使用できます。引数として InteractionSourceNode.Pointer を渡します。

OpenXR

OpenXR 入力操作を通じて、次の 2 セットの姿勢にアクセスできます。

  • 手の中のオブジェクトをレンダリングするグリップの姿勢
  • この姿勢の目的はワールドを指し示すことです。

この設計と 2 つの姿勢の違いの詳細については、「OpenXR 仕様 -入力サブパス」を参照してください。

InputFeatureUsages DevicePositionDeviceRotationDeviceVelocity および DeviceAngularVelocity によって提供される姿勢はすべて、OpenXR グリップの姿勢を表します。 InputFeatureUsages は、Unity の CommonUsages で定義されています。

InputFeatureUsages PointerPositionPointerRotationPointerVelocity および PointerAngularVelocity によって提供される姿勢はすべて、OpenXR グリップの姿勢を表します。 これらの InputFeatureUsages は、含まれている C# ファイルでは定義されていないので、次のように独自の InputFeatureUsages を定義する必要があります。

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

触覚

Unity の XR 入力システムで haptics を使用する方法については、 Unity XR 入力 - Haptics に関するドキュメントを参照してください。

コントローラーの追跡状態

ヘッドセットと同様に、Windows Mixed Reality モーション コントローラーでは、外付けの追跡センサーをセットアップする必要がありません。 代わりに、コントローラーはヘッドセット自体のセンサーによって追跡されます。

ユーザーがヘッドセットの視野からコントローラーを移動した場合、Windows はほとんどの場合、コントローラーの位置を引き続き受け取ります。 コントローラーで視覚的な追跡ができない時間が十分に長くなると、コントローラーの位置は近似精度の位置に低下します。

この時点で、システムはユーザーに対してコントローラーの本体ロックを行い、移動中のユーザーの位置を追跡しながら、引き続きコントローラーの内蔵方位センサーを使用して、コントローラーの正しい向きを公開します。 コントローラーを使用して UI 要素をポイントし、アクティブ化する多くのアプリは、ユーザーが気付かないまま近似精度になっても正常に動作できます。

状態を明示的に追跡する理由

追跡状態に基づいて異なる方法で位置を処理するアプリでは、SourceLossRiskPositionAccuracy など、コントローラーの状態のプロパティの検査まで行うことができます。

追跡状態 SourceLossRisk PositionAccuracy TryGetPosition
高精度 < 1.0 true
高精度 (失うリスクあり) == 1.0 true
近似精度 == 1.0 Approximate true
位置なし == 1.0 Approximate false

これらのモーション コントローラーの追跡状態は、次のように定義されます。

  • 高精度: モーション コントローラーがヘッドセットの視野内にあるときは、視覚的な追跡に基づいて、一般的に高精度の位置が提供されます。 移動中のコントローラーがヘッドセット センサーの視野から一瞬出たり、一瞬遮られたりしても、コントローラー自体の慣性追跡に基づいて、引き続き高精度の姿勢に短時間で戻ります。
  • 高精度 (失うリスクあり): ユーザーがヘッドセットの視野の端を越えてモーション コントローラーを動かすと、ヘッドセットはまもなくコントローラーの位置を視覚的に追跡できなくなります。 アプリでは、SourceLossRisk が 1.0 に達するのを確認することによって、コントローラーがこの視野の境界にいつ達したか認識できます。 アプリでは、その時点で、高品質の姿勢情報が途切れず流れる必要があるコントローラー ジェスチャを一時停止させることができます。
  • 近似精度: コントローラーで視覚的な追跡ができない時間が非常に長くなると、コントローラーの位置は近似精度の位置に低下します。 この時点で、システムはユーザーに対してコントローラーの本体ロックを行い、移動中のユーザーの位置を追跡しながら、引き続きコントローラーの内蔵方位センサーを使用して、コントローラーの正しい向きを公開します。 コントローラーを使用して UI 要素をポイントし、アクティブ化する多くのアプリは、ユーザーが気付かないまま近似精度になっても正常に動作できます。 入力要件がさらに厳しいアプリでは、PositionAccuracy プロパティを検査することで、精度から近似精度へのこの低下を検出できます。たとえば、この期間中に、画面外のターゲットに対するより大きいヒットボックスをユーザーに提供するために、これを行います。
  • 位置なし: コントローラーは近似精度で長時間動作できますが、本体ロックが行われた位置でさえ、現時点では意味がないとシステムが認識する場合があります。 たとえば、電源がオンにされたコントローラーが視覚的に観察されたことがない場合や、ユーザーが下に置いたコントローラーを別の誰かが拾った場合などです。 そうした場合、システムではアプリに位置情報を提供せず TryGetPosition は false を返します。

一般的な Unity API (Input.GetButton/GetAxis)

名前空間:UnityEngineUnityEngine.XR
種類: InputXR.InputTracking

Unity では現在、一般的な Input.GetButton/Input.GetAxis API を使用して、手やモーション コントローラーなど、Oculus SDKOpenVR SDK、Windows Mixed Reality の入力を公開しています。 アプリが入力にこれらの API を使用している場合は、Windows Mixed Reality を含む複数の XR SDK 間でモーション コントローラーを簡単にサポートできます。

論理ボタンの押された状態を取得する

一般的な Unity 入力 API を使用するには、通常、ボタンと軸を Unity Input Manager の論理名に接続し、各名前にボタンまたは軸の ID をバインドします。 その後、その論理ボタン/軸名を参照するコードを記述できます。

たとえば、左側のモーション コントローラーのトリガー ボタンを Submit アクションにマップするには、Unity 内の [編集] > [プロジェクト設定] > [入力] に移動し、軸の下にある [送信] セクションのプロパティを展開します。 次のように、[肯定ボタン] プロパティまたは [代替の肯定ボタン] プロパティを変更して、ジョイスティック ボタン 14 を読み取る必要があります。

Unity の InputManager
Unity の入力マネージャー

スクリプトでは、Input.GetButtonを使用して送信アクションを確認できます。

if (Input.GetButton("Submit"))
{
  // ...
}

論理ボタンを追加するには、[] の [サイズ] プロパティを変更します。

物理的なボタンの押された状態を直接取得する

Input.GetKey を使用して、完全修飾名でボタンに手動でアクセスすることもできます。

if (Input.GetKey("joystick button 8"))
{
  // ...
}

手やモーション コントローラーの姿勢

XR.InputTracking を使用して、コントローラーの位置と回転にアクセスできます。

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Note

上のコードは、コントローラーのグリップ姿勢 (ユーザーがコントローラーを保持している場所) を表します。これは、ユーザーの手の中にある剣や銃をレンダリングする場合や、コントローラー自体のモデルをレンダリングする場合に便利です。

このグリップと (コントローラーの先端が指している) ポインターの間のリレーションシップは、コントローラーによって異なる場合があります。 現時点では、コントローラーのポインターにアクセスするには、次のセクションで説明する MR 固有の入力 API を使用するしかありません。

Windows 固有の API (XR.WSA.Input)

注意事項

プロジェクトでいずれかの XR.WSA API を使用している場合、今後の Unity のリリースでは XR SDK が優先されるため、それらは段階的に廃止されています。 新しいプロジェクトの場合は、最初から XR SDK を使用することをお勧めします。 XR 入力システムおよび API の詳細についてはこちらを参照してください。

名前空間:UnityEngine.XR.WSA.Input
: InteractionManagerInteractionSourceStateInteractionSourceInteractionSourcePropertiesInteractionSourceKindInteractionSourceLocation

Windows Mixed Reality ハンド入力 (HoloLens) とモーションコントローラーの詳細情報を取得するには、 UnityEngine.XR.WSA.Input 名前空間で Windows 固有の空間入力 API を使用することを選択できます。 これにより、位置の精度やソースの種類などの追加情報にアクセスして、手とコントローラーを区別できます。

手とモーションコントローラーの状態のポーリング

このフレームの状態は、 GetCurrentReading メソッドを使用して、対話式操作ソース (手動またはモーションコントローラー) ごとにポーリングできます。

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

返される各 InteractionSourceState は、現在の時点の対話式操作ソースを表します。 InteractionSourceState は、次のような情報を公開します。

  • どのような 種類の押下 が発生していますか (選択/メニュー/つかみ/タッチパッド/サムスティック)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • タッチパッドやサムスティックの XY 座標とタッチされた状態など、モーション コントローラー固有のその他のデータ

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • ソースが手であるか、モーション コントローラーであるかを知るための InteractionSourceKind

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

前方予測レンダリング姿勢のポーリング

  • 手およびコントローラーからの対話式操作用ソース データをポーリングする場合、取得される姿勢は、このフレームの光子がユーザーの目に到達する瞬間を予測することです。 前方予測姿勢は、コントローラーまたは保持されたオブジェクトを各フレームに レンダリング する場合に最適です。 コントローラーで特定の押す、または放す、を対象としている場合は、次に説明する履歴イベント API を使用すると最も正確になります。

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • この現在のフレームの前方予測ヘッドを取得することもできます。 ソースの場合と同様に、これはカーソルをレンダリングするときに便利です。ただし、次に説明する履歴イベント API を使用する場合は、特定の押す、または放す、をターゲットにすると最も正確になります。

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

対話式操作ソースイベントの処理

正確な履歴データで発生した入力イベントを処理するために、ポーリングではなく対話式操作ソースイベントを処理できます。

対話式操作ソース イベントの処理

  • InteractionManager入力イベントに登録します。 関心がある対話式操作イベントの種類ごとに、サブスクライブする必要があります。

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • イベントを処理します。 対話式操作イベントをサブスクライブすると、必要に応じてコールバックが取得されます。 SourcePressed の例では、ソースが検出された後、解放されるか失われる前です。

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

イベントの処理を停止する方法

イベントに関心がなくなった場合、またはイベントをサブスクライブしているオブジェクトを破棄する場合は、イベントの処理を停止する必要があります。 イベントの処理を停止するには、イベントのサブスクリプションを解除します。

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

対話式操作ソース イベントの一覧

使用可能な相互作用ソースイベントは次のとおりです。

  • InteractionSourceDetected (ソースがアクティブになります)
  • InteractionSourceLost (ソースが非アクティブになります)
  • InteractionSourcePressed (タップ、ボタンを押す、または「選択」と発話する)
  • InteractionSourceReleased (タップの終わり、ボタンを放す、または「選択」と発話し終わる)
  • InteractionSourceUpdated (移動またはその他の状態の変更)

押す、または放す、と最も正確に一致する履歴ターゲットのイベント

前に説明したポーリング API を使用すると、アプリが姿勢を事前に予測するようになります。 これらの予測効果はコントローラーまたは仮想ハンドヘルド オブジェクトのレンダリングに最適ですが、次の 2 つの主な理由から、将来のターゲット設定には最適ではありません。

  • ユーザーがコントローラー上でボタンを押すと、システムがその押下を受け取るまで Bluetooth のワイヤレス待機時間が約 20 ミリ秒あります。
  • 次に、前方予測姿勢を使用している場合、現在のフレームの光子がユーザーの目に到達するタイミングをターゲットにするために、さらに 10~20 ミリ秒の前方予測が適用されます。

これは、ポーリングによって、ユーザーの頭や手が、押すまたは放すが発生したときに戻る元の姿勢や頭の姿勢が 30~40 ミリ秒後に発生するようにすることを意味します。 HoloLens の手で入力する場合、ワイヤレス転送の遅延はありませんが、押しを検出するために同様の処理遅延が発生します。

ユーザーが手やコントローラーを押したときの本来の意図に基づいて正確にターゲットを指定するには、その InteractionSourcePressed または InteractionSourceReleased の入力イベントから履歴ソースの姿勢や頭の姿勢を使用する必要があります。

ユーザーの頭またはコントローラーの履歴姿勢データを使用して、押すまたは放すをターゲットにすることができます。

  • ジェスチャまたはコントローラーの押下が発生した時点の頭の姿勢は、ユーザーが何を視線入力したかを判断するターゲットに使用できます。

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • モーション コントローラーの押下が発生した時点のソースの姿勢は、ユーザーが何をコントローラをポイントしたものをターゲットにするために使用できます。 これは、押下を経験したコントローラーの状態になります。 コントローラー自体をレンダリングする場合は、グリップの姿勢ではなくポインターの姿勢を要求できます。これにより、レンダリングされたコントローラーの自然なヒントをユーザーが考慮する対象から、ターゲットの光線をシュートすることができます。

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

イベントハンドラーの例

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

MRTK のモーション コントローラー

入力マネージャーからジェスチャとモーションコントローラーにアクセスできます。

チュートリアルに従う

詳細なカスタマイズ例が記載されたステップバイステップのチュートリアルは、Mixed Reality Academy でご利用いただけます。

MR 入力 213 - モーション コントローラー
MR 入力 213 - モーション コントローラー

次の開発チェックポイント

ここで述べる MRTK の主要機能の説明は、Microsoft による Unity 開発ガイドの一部です。 ここから、次の構成要素を続けることができます。

または、Mixed Reality プラットフォームの機能と API に移動します。

いつでも Unity 開発チェックポイントに戻ることができます。

関連項目