Version: 2022.3
言語: 日本語
サブシステムのランタイム検索とアクティベーション
XR SDK ディスプレイサブシステム

XR SDK 入力サブシステム

XR SDK Input Subsystem (入力サブシステム) は、ボタン、軸、トラッキングデバイスの情報を報告するためのインターフェースです。これは、ユーザーが制御するデータを Unity エンジンのさまざまな入力エンドポイントに取り込むための中核となるサブシステムです。Unity は、利用可能な情報の種類に応じて、入力情報を InputDevicesInput System に報告します。

基本的な XR 入力プロバイダーの作成

基本的な作業用 XR 入力プロバイダーを作成するには、以下の手順に従います。

  1. デバイスの接続と切断を報告
  2. すべての接続機器の定義情報を記入
  3. Unity が要求するたびに、デバイスの状態を更新
  4. 関連するすべてのイベントや問い合わせへの対応
  5. デバイスのレイアウトを新しい入力システムに報告

用語

本ガイドでは、以下の用語を使用します。

デバイス

ほとんどの入力サブシステム API はデバイスに依存しています。デバイスとは、ユーザーが選択した一意の ID で参照される入力機能のコンテナです。これはゲームパッドやヘッドセットのような具体的なものもあれば、検出された手のスケルトンのような抽象的なオブジェクトを表すこともあります。デバイスには固定された数の機能があり、デバイスが接続されている間は変更することができません。

機能

入力機能とは、センサーやユーザーが変更したデータを取得できるものです。ボタン、位置トラッキング要素、バッテリー寿命などがこれにあたります。入力機能はさまざまなタイプのデータに分類され、UnityXRInputFeatureType で識別されます。これらは、現在サポートされている入力デバイス上のデータ型です。

UnityXRInputFeatureType データ型
kUnityXRInputFeatureTypeCustom char[] (最大 1024 要素)
kUnityXRInputFeatureTypeBinary bool
kUnityXRInputFeatureTypeDiscreteStates 符号なし int
kUnityXRInputFeatureTypeAxis1D float
kUnityXRInputFeatureTypeAxis2D UnityXRVector2
kUnityXRInputFeatureTypeAxis3D UnityXRVector3
kUnityXRInputFeatureTypeRotation UnityXRVector4
kUnityXRInputFeatureTypeHand UnityXRHand
kUnityXRInputFeatureTypeBone UnityXRBone
kUnityXRInputFeatureTypeEyes UnityXREyes

Usage

Usage (使い方) は、機能のコンテキストを提供します。開発者がその機能をどのように使用すべきかを示します。例えば、その機能は 2D (2 次元) の軸であっても、使い方は開発者にそれをタッチパッドであると伝えます。また、使用によって、1D (1 次元) の軸の機能が、バッテリー残量のレポートであることを開発者に伝えることもできます。独自の使い方を作成することもできますが、Unity が開発した使い方をできるだけ多く使用する必要があります。使い方を使用することで、開発者はクロスプラットフォームでのユーティリティを実現することができます。すべての人が利用できる一般的な使い方のリストについては、以下の 機能の使い方 のセクションを参照してください。

UnityXRInternalInputDeviceId

UnityXRInternalInputDeviceId は、すべてのデバイスを識別します。これらの識別子は、特定のデバイスを参照するために Unity とプロバイダーの両方が共有する独自の ID であると考えてください。どの ID をどのデバイスにマップするかは自身で定義しますが、唯一の制約は、同時に接続された 2 つのデバイスに同じ ID を使用できないことです。特定の Id が接続中であると報告されると、Unity はその Id を使ってデバイスの能力や現在の状態に関する情報を要求し、その Id を使ってデバイス固有のイベントを送信します。

デバイスの接続と切断

IUnityXRInputInterface の 2 つの API で、デバイスの接続と切断を処理します。

IUnityXRInputInterface.InputSubsystem_DeviceConnected

これにより、新しいデバイスが報告されます。プロバイダーが提供する UnityXRInternalInputDeviceId には任意の値を指定できます。内部的に一意のデバイスを表し、同じプロバイダーから同じ Id で 2 つのデバイスが接続されない限り、この値は有効です。デバイスは、入力プロバイダーのライフサイクルの Start イベントと Stop イベントの間でのみ接続できます。IUnityXRInputProvider.Start が呼び出されたときに既に接続されているデバイスは、そのコールバック中に報告されなければなりません。

デバイスが接続されていると報告されると、Unity は、そのデバイスに関する特定の情報を得るために、次の入力更新ループで、供給された UnityXRInternalInputDeviceId を用いて、IUnityXRInputProvider.FillDeviceDefinition を呼び出します。

IUnityXRInputInterface.InputSubsystem_DeviceDisconnected

これは、入力デバイスが使用できなくなったことを報告するものです。入力デバイスが接続されていることを報告した後でなければ、切断されていることを報告することはできません。 IUnityXRInputProvider.Stop を受信する場合、現在接続されているすべての入力デバイスを切断されたものとして報告する必要があります。

上記の 2 つの呼び出しはスレッドセーフであり、いつでも呼び出すことができます。

デバイスの定義

Device Definition (デバイスの定義) は、デバイスが Unity に報告できる機能を記述します。機能は、デバイス名、役割、メーカー、シリアル番号などのデバイス識別情報で構成されます。また、Device Definition には、利用可能な個々の入力機能のインデックス付きリストが含まれています。

デバイスが接続されたことが報告されると、Unity は IUnityXRInputProvider.FillDeviceDefinition を通してプロバイダーを呼び出します。 UnityXRInputDeviceDefinition パラメーターは、IUnityXRInputInterface 上の DeviceDefinition というプレフィックス付きのあらゆるメソッドに渡すことができるハンドルとして機能します。それらのメソッドは以下の通りです。

識別情報の設定

開発者は、特定のデバイスや新たに接続されたデバイスの一般的な機能を識別するために、デバイスの一部のデータを使用します。

IUnityXRInputInterface.DeviceDefinition_SetName

これにより、プロバイダーはデバイスの名前を設定することができます。名前は、明確かつ簡潔であり、大市場の消費者が認識できるものでなければなりません。これには製造者名を含むことはできません。この名前は、UnityEngine.XR.InputDevice.name を通して開発者がアクセスでき、インプットシステムの InputDevice.product に利用できます。

IUnityXRInputInterface.DeviceDefinition_SetCharacteristics

これにより、プロバイダーは接続したデバイスのタイプを指定できます。 UnityXRInputDeviceCharacteristics は、デバイスの能力を定義するための一連のフラグです。これらは、InputDevice の入力システムの usage を変更します。

IUnityXRInputInterface.DeviceDefinition_SetManufacturer

これにより、プロバイダーはデバイスのメーカー名を設定することができます。製造者は、明確かつ簡潔であり、大市場の消費者が認識できるものでなければなりません。この文字列には、 UnityEngine.XR.InputDevice.manufacturer を通して開発者がアクセスでき、インプットシステムの InputDevice.manufacturer に利用できます。これを空白にしないでください。

IUnityXRInputInterface.DeviceDefinition_SetSerialNumber

これにより、プロバイダーはデバイスのシリアル番号を設定することができます。開発者はこの文字列に、UnityEngine.XR.InputDevice.serialNumber を通してアクセスでき、インプットシステムの InputDevice.serialNumber に利用できます。これは、特定のデバイスに固有の ID である必要があり、そうでない場合は空白にしてください。

機能の追加

以下の API コールを通して、デバイス定義に入力機能 (Input Feature) を追加することができます。

IUnityXRInputInterface.DeviceDefinition_AddFeature

これは、設定された型の機能 (kUnityXRInputFeatureTypeCustom を除く) を追加し、その新しい機能の UnityXRInputFeatureIndex を返します。

IUnityXRInputInterface.DeviceDefinition_AddCustomFeature

これにより、kUnityXRupterFeatureTypeCustom 機能が追加されます。これは、最大 1024 バイトの可変バッファです。これらを使用して、Unity に知られていない、明示的なサイズを必要とするカスタムの型を作成することができます。このメソッドは、その新機能の UnityXRInputFeatureIndex を返します。

IUnityXRInputInterface.DeviceDefinition_AddFeatureWithUsage

これは、機能を追加するだけでなく、Feature usages (機能の使い方) を 1 つ含みます。このメソッドは、 DeviceDefinition_AddFeatureDeviceDefinition_AddUsageAtIndex を組み合わせたヘルパーで、その新機能の UnityXRInputFeatureIndex を返します。

IUnityXRInputInterface.DeviceDefinition_AddUsageAtIndex

これは、機能の使い方 を既存の機能に追加します。機能を追加するメソッドの 1 つから UnityXRInputFeatureIndex を取得します。1 つの機能に制限なく使い方を追加することができます。

ノート: 返された UnityXRInputFeatureIndex の値は、すべて追加された順になっています。

Device states

Device states (デバイス状態) は、デバイスの現在の状態を含むデータ構造体です。 UnityXRInputDeviceState の構造体は、 UnityXRInputDeviceDefinition によって説明されます。

ノート: Device State 内に含まれる機能は、デバイス定義でその機能を宣言する際に報告された UnityXRInputFeatureIndex でアクセスされます。

Device State 更新の型

定義が宣言されると、Unity は IUnityXRInputProvider.UpdateDeviceState を通して、1 フレームに 2 回、デバイス状態を要求します。UnityXRInputUpdateType パラメーターは、Unity が期待するアップデートの種類を指定します。

  • kUnityXRInputUpdateTypeDynamic は、Unity が MonoBehaviour.Update の呼び出しとコルーチンの継続を反復する前の更新です。これらは、デバイスが現在どこにあるかを表します。
  • kUnityXRInputUpdateTypeBeforeRender は、Unity がヘッドセットにレンダリングする準備をする直前、且つ、Application.OnBeforeRender が呼び出される直前に呼び出されます。これらの呼び出しには、前方予測トラッキングポジションを使用し、シーンを表示するのにかかる時間に、シーンをレンダリングする場所を表します。

Device State のメソッド

UnityXRInputDeviceState パラメーターは、IUnityXRInputInterface 上の DeviceState というプレフィックス付きのあらゆるメソッドに渡すことができるハンドルとして機能します。

IUnityXRInputInterface.DeviceState_SetCustomValue

これは、kUnityXRInputFeatureTypeCustom 型の機能を、供給された UnityXRInputFeatureIndex に設定します。カスタム値機能を設定する場合、プロバイダーは常に宣言された機能のフルサイズで値を設定する必要があり、部分的な値の設定はできません。また、提出時にすべてのカスタム機能を Unity に宣言し、どのようなデータが含まれているのか、なぜ他の個別機能型では存在できないのかを詳しく説明する必要があります。

IUnityXRInputInterface.DeviceState_SetBinaryValue

これは、 kUnityXRInputFeatureTypeBinary 型のブーリアン型 (オン/オフ) 機能を設定します。この機能のデフォルト、休止中、または未使用の状態は false でなければなりません。

IUnityXRInputInterface.DeviceState_SetDiscreteStateValue

32 ビットの符号なし int の値を設定します。これは、列挙型を表すのにも使用できます。デフォルトの未使用の値は 0 でなければならず、列挙型に使用する場合、0 は null、none、unset、invalidのいずれかの値を表す必要があります。

IUnityXRInputInterface.DeviceState_SetAxis1DValue

32 ビットの float を設定します。デフォルトの未使用の値は 0.0 でなければなりません。

IUnityXRInputInterface.DeviceState_SetAxis2DValue

これは UnityXRVector2 型の値を設定します。UnityXRVector2 構造体は、32 ビット float のペア (X, Y) です。デフォルトの未使用の値は (0.0, 0.0) でなければなりません。

IUnityXRInputInterface.DeviceState_SetAxis3DValue

これは UnityXRVector3 型の値を設定します。UnityXRVector3 構造体は、32 ビット float のペア (X, Y, Z) です。デフォルトの未使用の値は (0.0, 0.0, 0.0) でなければなりません。

IUnityXRInputInterface.DeviceState_SetRotationValue

これは、UnityXRVector4 型の値を設定するもので、クォータニオンとして構成されています。デフォルトの未使用の値は (0, 0, 0, 1) でなければなりません。詳細は、Quaternion を参照してください。

IUnityXRInputInterface.DeviceState_SetBoneValue

これは、UnityXRBone 型の値を設定します。

IUnityXRInputInterface.DeviceState_SetHandValue

これは、UnityXRHand 型の値を設定します。

IUnityXRInputInterface.DeviceState_SetEyesValue

これにより、UnityXREyes 型の値が設定されます。

ノート: 渡される UnityXRInputFeatureUsageIndex は、 UnityXRInputFeatureDefinition を入力する際に、その個別機能をデバイス定義に追加する際に返されるものと同じものです。

機能別の構造体

以下のより高度な型は、複数のデータソースからのデータを格納ために使用される特別な機能の型です。

UnityXRBone

これらは、ボーンや、階層化されたポーズの 1 要素を空間に表します。position メンバーは、Y が上になる左手の座標を使って、メートル単位の 3 次元の位置を表します。rotation メンバーは、そのボーンの空間での向きを表し、ラジアン単位の正規化されたクオータニオンで表されます。parentBoneIndex は、 UnityXRInputFeatureIndex であり、階層の上位にある UnityXRBone を指すか、このスケルトンのルートである場合は kUnityInvalidXRInputFeatureIndex を指す必要があります。

UnityXRHand

これらは、手のようなボーンの構造を表しています。これらは、骨の階層を指とルートに整理し、簡単に走査できるようにします。 rootBoneIndex は、常に kUnityXRInputFeatureTypeBone 型である有効なインデックスを指していなければなりません。kUnityXRInputFeatureTypeBone は手のひら、または、手の中心を表します。fingerBoneIndices は、最初の次元または配列を個々の指にマップするように UnityXRHandFinger 列挙値に従って積み重ねられる必要があり、配列の 2 番目の次元は根元から先端までの個々の指のボーンです。

UnityXREyes

これらは一対の目、その固定点、現在の瞬きのデータを表します。leftEyePoserightEyePose は、 UnityXRPose 型で、 position メンバーは、Y を上にした左手座標での 3 次元の位置 (メートル単位) を表し、rotation メンバーは、ラジアン単位の正規化されたクォータニオンを表します。fixationPoint は、左目と右目が収束する位置を表しています。これは、Y を上にした左手座標での 3 次元の位置 (メートル単位) です。leftOpenAmountrightOpenAmount は、目の開き具合を表しており、0 が閉じていて、1 が完全に開いている状態です。これらは [0,1] の範囲を超えることはできません。

イベント処理

デバイスの状態や定義の更新以外では、Unity はさまざまなイベントへ反応や対応を処理できます。

汎用イベント

UnityXRInputProvider.HandleEvent

これは、このプロバイダーに固有の private イベントのためのものです。 eventType パラメーターは、ペイロードを識別するために使用されるカスタムコードです。プロバイダーがそのイベントを理解していない場合、kUnitySubsystemErrorCodeFailure を返します。

Tracking Origin イベント

トラッキングオリジンとは、追跡されたデバイスが相対している実世界の空間位置を参照します。それは、実際には、デバイスが位置 (0, 0, 0) を報告する実世界の空間の点です。Unity は様々なトラッキングオリジンモードをサポートしており、プロバイダーはサポートするモードを選択することができます。トラッキングオリジンモードは、 UnityXRingTracingOriginModeFlags の 1 つです。

kUnityXRionTrackingOriginModeDevice は、起動時の主要デバイスの位置とヨー、または最後に UnityXRInputProvider.HandleRecenter イベントが発生した位置に原点を置きます。

kUnityXRionTrackingOriginModeFloor は、原点を床のどこかに配置します。開発者が床とさまざまなデバイスの高さの違いを理解できる限り、床上の原点の位置はプロバイダー次第です。

kUnitionXRIntTracingOriginModeTrackingReference は、 kUnitionXRIntDeviceCharacteristicsTrackingReference の特性を持つ特定の InputDevice の位置に原点を置きます。

最後に、kUnityXRionTrackingOriginModeUnknown はエラーケースであり、プロバイダーから返されるべきではありません。

UnityXRInputProvider.HandleRecenter

トラッキングオリジンモードが kUnityXRInptTracingOriginModeDevice に設定されている場合、recenter を呼び出すと、主要デバイスの現在地が新しい原点として設定されます。

UnityXRInputProvider.QueryTrackingOriginMode

これは、プロバイダーが使用する現在のトラッキングオリジンモードを取得するための Unity からのリクエストです。プロバイダーは trackingOriginMode パラメーターを設定し、 kUnitySubsystemErrorCodeSuccess を返します。返されるパラメーターは、1 つのフラグ値のみでなければなりません。

UnityXRInputProvider.QuerySupportedTrackingOriginModes

これは、トラッキングオリジンモードがサポートされているリクエストです。プロバイダーは、supportedTrackingOriginModes パラメーターを設定し、kUnitySubsystemErrorCodeSuccess を返します。返されるパラメーターは、UnityXRInputProvider.HandleSetTrackingOriginMode** がサポートできる、すべての UnityXRInputTrackingOriginModeFlags の累積リストです。

UnityXRInputProvider.HandleSetTrackingOriginMode

これは、現在のトラッキングオリジンモードを変更するための Unity からのリクエストです。trackingOriginMode パラメーターは、希望のトラッキングオリジンモードです。プロバイダーは、オリジンを変更できる場合は kUnitySubsystemErrorCodeSuccess を、そうでない場合は kUnitySubsystemErrorCodeSuccess を返します。トラッキングオリジンモードがすでに希望のモードである場合、プロバイダーは何もせず、 kUnitySubsystemErrorCodeSuccess を返します。

IUnityXRInputInterface.InputSubsystem_TrackingOriginUpdated

これは、プロバイダーが送信するイベントで、トラッキングオリジンの位置が変更されたことを Unity に通知します。これは、UnityXRInputProvider.HaldeSetTrackingOriginMode が成功して原点を移動したときに呼びだされなければなりません。また、トラッキング情報全体の変更のためにプロバイダーがオリジンを変更しなければならない場合にも呼び出されます。

IUnityXRInputInterface.InputSubsystem_SetTrackingBoundary

これはプロバイダーが送信するイベントで、利用可能なトラッキング境界があること、またはトラッキング境界が変更されたことを Unity に通知します。境界が存在し、境界の相対的な位置が移動するなど、トラッキングオリジンが変更された場合に呼び出される必要があります。既存のトラッキング境界を削除するために、NULL や 0 位置を指定して呼び出すことができます。

Haptic (触覚) イベント

UnityXRInputProvider.QueryHapticCapabilities

これは、プロバイダーが記入する、指定されたデバイスの触覚能力のリクエストです。supportsImpulse を true に設定すると、 UnityXRInputProvider.HandleHapticImpulse のイベントが有効になります。 supportsBuffer を true に設定すると、 UnityXRInputProvider.HandleHapticBuffer のイベントが有効になります。

ノート: 能力構造体では、プロバイダーがチャンネルの数を設定したり、チャンネルインデックスを含む触覚の開始や停止をリクエストすることができます。これにより、プロバイダーは 1 つのデバイスの中に複数のモーターを持ち、個々に動かすことができます。最初のチャンネルは最も一般的なモーターを使うべきですが、それ以降の順序はプロバイダー次第です。

UnityXRInputProvider.HandleHapticImpulse

これは、設定された持続時間の間、設定された振幅でデバイスを動かすためのリクエストです。Unity はこのリクエストのデータを入力します。バッファのパラメーターは UnityXRHapticImpulse 型です。

UnityXRInputProvider.HandleHapticBuffer

これは、パターンを、設定されたバッファで動かすためのリクエストです。Unity はこのリクエストのデータを入力します。バッファのパラメーターは UnityXRHapticUpdate 型です。

bufferSize は、UnityXRInputProvider.QueryHapticCapabilities イベントから返される UnityXRHapticCapabilities.bufferMaxSize 値を超えることはありません。

UnityXRInputProvider.HandleHapticStop

これは、あらゆる触覚効果を停止するための Unity からのリクエストです。これにより、提供された UnityXRInternalInputDeviceId のインパルスまたはバッファリングされた触覚効果を停止します。

Feature usages

Feature usage (機能の使い方) とは、機能に関するコンテキストを提供するシンプルな文字列タグで、Unity 開発者が一般的な方法でデバイスにアクセスするのに役立ちます。デバイスのトリガー、デバイス位置、メニューボタン、その他の入力機能の共通コンセプトを宣言することができます。開発者は、デバイスが何であるかを正確に知らなくても、これらにアクセスしてデバイスを操作することができます。また、Feature usages は、入力データを UnityEngine.InputUnityEngine.XR.InputTracking にルーティングしたり、インデックスを決定するためにも使用されます。1 つの入力フィーチャーに複数の用途を持たせることができますが、宣言した各入力フィーチャーには少なくとも 1 つの用途を割り当てる必要があります。Unity がデフォルトで提供する使用法を使用しないことを選択した場合は、認証申請時に何を使用したかを Unity に知らせ、Unity からのフィードバックに基づいて使用法の文字列を更新する準備をしなければなりません。

すべてのワールド空間の使用法の単位は、メートル、m/s、m/s2、または必要に応じてラジアンです。空間の向きは、左手、Z が前方、Y が上とします。空間の原点は、接続時のデバイスの位置とします。この空間は独自のものであり、Unity のワールド空間には直接マップしません。

これらは、Unity で利用可能な一般的な使用方法です。

ポーズとトラッキング

以下の機能は、実世界でトラッキングを供給するデバイスのためのものです。現在のトラッキング機能を確認するのに役立ちます。

kUnityXRInputFeatureUsageIsTracked は、デバイスが現在正しく追跡されているかどうかを指定するブーリアンです。True は完全に追跡されていることを意味し、False は部分的または追跡されていないことを意味します。

kUnitionXRingFeatureUsageTrackingState は、UnityXRingTrackingStateFlags 列挙型によってバックアップされる個別の状態機能であり、どの実際のトラッキング機能が現在利用可能であり、更新されているかを識別します。この値は、kUnityXRInputTrackingStateAll 以上であってはなりません。

残りのトラッキング機能は、デバイス、左目、カラーカメラなど、特定のノードに関する個々のデータをリレーします。これらの機能は、データの種類に応じて 6 つを含む群に分類されます。これらは、 kUnityXRInpureFartionUsageTrackingState の現在の値と連動して更新する必要があります。つまり、トラッキングの状況に位置が可能と表示されている場合、すべての position usages が正しく更新されている必要があります。

使用可能なプレフィックスは以下の通りです。

プレフィックス 説明 
kUnityXRInputFeatureUsageDevice 入力デバイスの汎用化された位置
kUnityXRInputFeatureUsageCenterEye 全ての目のレンダリング位置の平均値の中央
kUnityXRInputFeatureUsageLeftEye 左目のレンダリング位置
kUnityXRInputFeatureUsageRightEye 右目のレンダリング位置
kUnityXRInputFeatureUsageColorCamera 受信したカメラフィードの位置

これらのプレフィックスには、以下のような、さまざまなトラッキング属性を表す一連の利用可能なサフィックスがあります。 * Position * Rotation * Velocity * ** AngularVelocity** * Acceleration * ** AngularAcceleration**

これらを定義に加えないと、決して利用できません。これらを含んでいても kunityxrionFartureUsageTrackingState の機能で利用できないとタグ付けされている場合は、その機能は現在は利用できないが、後で利用できるようになる可能性があることを意味します。

デバイス情報

これらは、ユーザーが操作するものではなく、一般的なデバイス情報を含んでいます。ユーザーが直接操作できないデバイスの機能です。

kUnitionXRionFarterUsageBatteryLevel は、デバイスの現在のバッテリーレベルを表す 1 次元軸の機能で、0 はバッテリーが空の状態、1 は完全に充電されている状態を表します。常に [0–1] の範囲内でなければなりません。

kUnityXRInputFeatureUsageUserPresence は、ユーザーが現在ヘッドセットを装着している場合に true を返すブーリアンです。

2D 軸

タッチパッドやジョイスティックのような、2 次元のアナログ float 値です。これらのコントロールは通常、親指で動かします。X と Y の両方を提供し、常に ([–1,1],[–1,1]) の範囲にある必要があります。

kUnitionXRionFarterUsagePrimary2DAxis は、タッチパッドやジョイスティックを表す 2D 軸機能です。0,0 はアイドル位置で、Y の正の値はコントローラーを持つユーザーから離れた位置です。

kUnitionXRionFarterUsagePrimary2DAxis は、 kUnityXRInputFeatureUsagePrimary2DAxis 以外に使用する補足のタッチパッドやジョイスティックを表す 2D 軸機能です。0,0 はアイドル位置で、Y の正の値はコントローラーを持つユーザーから離れた位置です。

1D 軸

これらはすべて 1 次元のアナログ float 値です。ボタン、トリガー、その他の “半押し” できるコントロールはここで識別されます。

kUnityXRInputFeatureUsageTrigger は、人さし指作動のトリガーにマップされる 1D 軸です。これは常に [0,1] の範囲内でなければならず、0 は開いた状態、1 は完全に握った状態を表します。これを実装する場合、デバイスは kunityxRupterFeatureUsageTriggerButton も実装する必要があります。

kUnityXRInputFeatureUsageGrip は、手を握ることによって作動するグリップに対応する 1D 軸です。この軸は常に [0,1] の範囲内でなければならず、0 は開いた状態、1 は完全に握った状態を表します。これを実装する場合、デバイスは *kUnityXRInputFeatureUsageGripButton も実装する必要があります。

バイナリ

これらは一次元のデジタル値です。作動させることも、させないこともできますが、それ以上の粒度はありません。

kunityxrionFarterUseagePrimaryButton は、コントローラーの主要ボタンを表すバイナリ機能です。一般的には、メニューの承認や先に進むためのボタンとして使用されます。これが作動すると、 kunityxriuntFertureUsagePrimaryTouch が存在する場合は、それも作動しなければなりません。

kUnitionXRingFartureUsagePrimaryTouch は、コントローラーの主要ボタンのタッチ状態を表すバイナリ機能です。これを実装する場合、デバイスは kUnityXRingFartureUsagePrimaryButton を実装する必要があります。

kunitionXRionFarterUseageSecondaryButton は、コントローラーの補助ボタンを表すバイナリ機能です。一般的には、戻る場合やその他のボタンとして使用されます。これが作動すると、 kUnityXRInputFeatureUsageSecondaryTouch が存在する場合は、それも作動しなければなりません。

kUnityXRInputFeatureUsageSecondaryTouch は、コントローラーの補助ボタンのタッチ状態を表すバイナリ機能です。これを実装する場合、デバイスは kUnityXRInputFeatureUsageSecondaryButton を実装する必要があります。

kUnityXRInputFeatureUsageGripButton は、手で握る動作がトリガーされるかどうかを表すバイナリ機能です。これを実装する場合、デバイスは kUnityXRInputFeatureUsageGrip も実装する必要があります。

kUnityXRInputFeatureUsageTriggerButton は、手で握る動作がトリガーされるかどうかを表すブーリアン機能です。これを実装する場合、デバイスは kUnityXRInputFeatureUsageTrigger も実装する必要があります。

kUnitionXRionFarterUsageMenuButton は、ゲーム以外の一時停止やメニューボタンを表すバイナリ機能です。通常はユーザーの手が簡単に届かないところにあります。

kUnitionXRIntFeatureUsagePrimary2DAxisClick は、 kUnitionXRIntFetureUsagePrimary2DAxis 2D 軸の押下やクリックを表すバイナリ機能です。これが実装されている場合、デバイスは kUnityXRIuntFeatureUsagePrimary2DAxis を実装する必要があります。これが作動する場合、kUnityXRInputFeatureUsagePrimary2DAxisTouch が存在する場合は、それも作動する必要があります。

kUnityXRInputFeatureUsagePrimary2DAxisTouch は、kUnityXRInputFeatureUsagePrimary2DAxis 2D 軸の軽いタッチを表すバイナリ機能です。これが実装されている場合、デバイスは kUnityXRInputFeatureUsagePrimary2DAxis を実装する必要があります。

kUnityXRInputFeatureUsageSecondary2DAxisClick は、kUnityXRInputFeatureUsageSecondary2DAxis 2D 軸の押下やクリックを表すバイナリ機能です。これが実装されている場合、デバイスは kUnityXRInputFeatureUsageSecondary2DAxis を実装する必要があります。これが作動する場合、kUnityXRInputFeatureUsageSecondary2DAxisTouch が存在する場合は、それも作動する必要があります。

kUnityXRInputFeatureUsageSecondary2DAxisTouch は、kUnityXRInputFeatureUsageSecondary2DAxis 2D 軸の軽いタッチを表すバイナリ機能です。これが実装されている場合、デバイスは kUnityXRInputFeatureUsageSecondary2DAxis を実装する必要があります。

センサーベース

これらは個々のセンサー型を表します。手や目の型のデータを検索するための省略形として使用されます。

kUnityXRInuteFartureUsageHandData は、ハンドトラッキングデータを表す UnityXRHands 機能です。 kUnityXRInuteFartureUsageEyesData は、アイトラッキングデータを表す UnityXREyes 機能です。

新しい入力システムのデバイスレイアウト

新しい入力システムを使用する際に、ユーザーがコードを使ってデバイスのプロパティにつなげてアクセスできるようにするには、入力プロバイダーの一部としてデバイスのレイアウト記述を提供する必要があります。

入力プロバイダーで定義したデバイスタイプごとに、デバイスレイアウトを提供する必要があります。 登録するデバイスに明示的なデバイスレイアウトを提供しないと、ユーザーは新しい Input System UI を使ってデバイスの機能に紐づけることができません。Input System はデバイスデータを受信し、ユーザーは新しいデバイス機能へのバインディングを手動で作成することができます。

Input System のデバイスレイアウトの詳細については、Input System のドキュメントを参照してください。簡単に実装できるように、以下の例を参照してください。

デバイスのレイアウト例

この例では、新しい Example VR Controller のレイアウトを提供します。 Example VR Controller の XRSDK のレイアウト定義は、以下のように記述されています。 - exampleButton と呼ばれる追加の kUnityXRInputFeatureTypeBinary値 - examplePosition と呼ばれる kUnityXRInputFeatureTypeAxis3D 値 - exampleRotation と呼ばれる kUnityXRInputFeatureTypeRotation

ユーザーが新しい入力システムを使ってデバイスを紐づけて操作できるようにするためには、新しいExample VR Controller 用のデバイスレイアウトを用意する必要があります。

まず、InputControlLayout 属性を提供し、さらに、New Input System UI で使用する明示的な名前が必要です。[Preseve] 属性を使用して、これらの要素がコンパイルの段階で取り除かれないようにします。

[Preserve]
[InputControlLayout(displayName = "Example VR Controller")]
public class ExampleVRController : XRController
{

次に、XRSDK レイアウトで定義されるさまざまな要素の InputControl マッピングを提供します。 [Preserve] を再度使用して、これらの要素がビルドから削除されないようにします。aliases キーワードを使用すると、新しい Input System では、提供されたエイリアスに基づいて共通のマッチングが行われます。

        [Preserve]
                [InputControl(aliases = new[] { "PrimaryButton" })]
                public ButtonControl exampleButton { get; private set; }
                [Preserve]
                [InputControl]
                public Vector3Control examplePosition { get; private set; }
                [Preserve]
                [InputControl]
                public QuaternionControl exampleRotation { get; private set; }

最後に、コントロールマッピングをコントロールのインスタンスに紐づける FinishSetup メソッドの実装を行います。基本クラスの FinishSetup も必ず呼び出してください。そうでないと、基本コンロトールが紐づけられません。

        protected override void FinishSetup()
                {
                    base.FinishSetup();

                    exampleButton = GetChildControl<ButtonControl>("exampleButton");
                    examplePosition = GetChildControl<Vector3Control>("examplePosition");
                    exampleRotation = GetChildControl<QuaternionControl>("exampleRotation");            
                }

レイアウトの登録

最後に行う必要があるのは、これらのデバイス用の XRSDK Loader を起動したときに、新しいデバイスレイアウトを New Input System に登録することです。以下のコードは、この実装の例です。

REGEX THAT MATCHES YOUR DEVICE セクションには、製品に正しく合致する文字列、またはデバイスを接続したときに XRSDK Input Provider から提供されるその他の文字列を記入する必要があります。

        public override bool Initialize()
                {
        # if UNITY_INPUT_SYSTEM
                    InputLayoutLoader.RegisterInputLayouts();
        # endif

        # if UNITY_INPUT_SYSTEM
        # if UNITY_EDITOR
            [InitializeOnLoad]
        # endif
            static class InputLayoutLoader
            {
                static InputLayoutLoader()
                {
                    RegisterInputLayouts();
                }

                public static void RegisterInputLayouts()
                {
                    UnityEngine.InputSystem.InputSystem.RegisterLayout<ExampleVRController>(
                        matches: new InputDeviceMatcher()
                            .WithInterface(XRUtilities.InterfaceMatchAnyVersion)
                            .WithProduct("<REGEX THAT MATCHES YOUR DEVICE>")
                    );


独自の入力プロバイダーを作成するためのチェックリスト

  • 基本的なライフサイクルの登録を設定します。
    • Initialize、Start、Stop、Shutdown のための関数ポインターを持つ ** IUnityXRInputInterface.RegisterLifecycleProvider**
    • 入力プロバイダー呼び出しが入力された UnityLifecycleProvider.Initialize コールバックから呼び出される IUnityXRInputInterface.RegisterInputProvider
  • 接続された各デバイスに対し、固有の Id を持つ IUnityXRInputInterface.InputSubsystem_DeviceConnected を呼び出します。
  • UnityXRInputProvider.FillDeviceDefinition に各デバイスの有効なデバイス定義を記入。
    • 有効な名前を追加します。
    • 有効なロールを追加します。
    • 少なくとも 1 つの Input Feature を加えます。
  • 各接続デバイスに対し、** UnityXRInputProvider.UpdateDeviceState** のデバイス状態を更新します。
    • レンダリングのためにトラッキング位置を前方予測できる場合は、更新が kUnityXRInputUpdateTypeBeforeRender 型の場合は、前方予測を行います。
  • 任意のバウンディングボックスを持つ IUnityXRInputInterface.InputSubsystem_SetBoundaryPoints を呼び出します。
  • UnityXRInputProvider.QueryTrackingOriginModeUnityXRInputProvider.QuerySupportedTrackingOriginModesUnityXRInputProvider.HandleSetTrackingOriginModeを実装します。
  • UnityXRInputProvider.TryRecenter を実装します。
  • 新しい Input System のデバイスレイアウトを提供します。
サブシステムのランタイム検索とアクティベーション
XR SDK ディスプレイサブシステム