入力システム データ プロバイダーの作成 — MRTK2
Mixed Reality Toolkit 入力システムは、入力デバイス サポートを有効にするための拡張可能なシステムです。 新しいハードウェア プラットフォームのサポートを追加するには、カスタムの入力データ プロバイダーが必要になることがあります。
この記事ではカスタムのデータ プロバイダーを作成する方法と、入力システムのためにデバイス マネージャーを呼び出す方法について説明します。 ここで示すコード例は、WindowsMixedRealityDeviceManager
からのものです。
この例で使用するコードの全体は、MRTK/Providers/WindowsMixedReality フォルダーにあります。
名前空間とフォルダー構造
データ プロバイダーは、サード パーティのアドオンとして、または Microsoft Mixed Reality Toolkit の一部として配布できます。 MRTK への新しいデータ プロバイダーの提出の承認プロセスは、ケースバイケースで異なり、最初の提案の時点で伝達されます。
重要
システム データ プロバイダーを Mixed Reality ツールキット リポジトリ に送信する場合、名前空間は、Microsoft.MixedReality.Toolkit で始まる必要があり (例: Microsoft.MixedReality.Toolkit.WindowsMixedReality)、コードは MRTK/Providers (例: MRTK/Providers/WindowsMixedReality) 下のフォルダーに配置される必要があります。
名前空間
名前が競合する可能性を低減するために、データ プロバイダーでは名前空間を使用する必要があります。 名前空間には次の構成要素を含めることをお勧めします。
- 会社名
- Feature area (機能領域)
たとえば、Contoso 社によって作成された入力データ プロバイダーの場合は、"Contoso.MixedReality.Toolkit.Input" にすることができます。
推奨のフォルダー構造
次の図に示すように、データ プロバイダーのソース コードをフォルダー階層で整理することをお勧めします。
ContosoInput にデータ プロバイダーの実装が含まれる場合、[Editor] フォルダーにはインスペクター (および他の Unity エディターに特有のコード) が含まれ、[Textures] フォルダーにはサポートされているコントローラーのイメージが含まれ、[Profiles] には 1 つ以上の事前作成されたプロファイルが含まれます。
Note
いくつかの共通のコントローラーのイメージは、MixedRealityToolkit\StandardAssets\Textures フォルダーにあります。
データ プロバイダーを実装する
インターフェイスと基底クラス継承のどちらかまたは両方を指定する
すべての入力システム データ プロバイダーにおいて、入力システムが必要とする最小の機能を指定する、IMixedRealityInputDeviceManager
インターフェイスを実装する必要があります。 MRTK Foundation には、この必須機能の既定の実装を提供する BaseInputDeviceManager
クラスが含まれています。 Unity の UInput クラスをベースとして構築されるデバイスの場合は、基底クラスとして UnityJoystickManager
クラスを使用することができます。
Note
BaseInputDeviceManager
クラスと UnityJoystickManager
クラスは、必要な IMixedRealityInputDeviceManager
の実装を提供しています。
public class WindowsMixedRealityDeviceManager :
BaseInputDeviceManager,
IMixedRealityCapabilityCheck
{ }
WindowsMixedRealityDeviceManager
はIMixedRealityCapabilityCheck
を使用することにより、一連の入力機能のサポート (具体的には、多関節ハンド、Gaze-Gesture-Voice の手ぶり、モーション コントローラー) を提供することを示しています。
MixedRealityDataProvider 属性を適用する
入力システム データ プロバイダーを作成する重要なステップは、MixedRealityDataProvider
属性をクラスに適用することです。 このステップでは、プロバイダーの既定のプロファイルとプラットフォームを、入力システム プロファイルで選択することによって設定することができます。
[MixedRealityDataProvider(
typeof(IMixedRealityInputSystem),
SupportedPlatforms.WindowsUniversal,
"Windows Mixed Reality Device Manager")]
public class WindowsMixedRealityDeviceManager :
BaseInputDeviceManager,
IMixedRealityCapabilityCheck
{ }
IMixedRealityDataProvider メソッドを実装する
クラスを定義したら、次の手順として、IMixedRealityDataProvider
インターフェイスの実装を提供します。
Note
BaseInputDeviceManager
クラスは、BaseService
クラスを介して、IMixedRealityDataProvider
メソッドの空の実装のみ提供します。 これらのメソッドの詳細は、通常はデータ プロバイダーごとに異なります。
データ プロバイダーで実装する必要があるメソッドは、次のとおりです。
Destroy()
Disable()
Enable()
Initialize()
Reset()
Update()
データ プロバイダーのロジックを実装する
次の手順は、サポート対象のすべてのコントローラーを含む、入力デバイスの管理のためのロジックを追加することです。
コントローラーのクラスを実装する
WindowsMixedRealityDeviceManager
の例では、次のコントローラーのクラスを定義して実装しています。
これらの各クラスのソース コードは、MRTK/Providers/WindowsMixedReality フォルダーにあります。
- WindowsMixedRealityArticulatedHand.cs
- WindowsMixedRealityController.cs
- WindowsMixedRealityGGVHand.cs
Note
すべてのデバイス マネージャーで、複数のコントローラーの種類がサポートされるわけではありません。
MixedRealityController 属性を適用する
次に、MixedRealityController
属性をクラスに適用します。 この属性は、コントローラーの種類 (例: 多関節ハンド)、利き手 (例: 左または右)、オプションのコントローラー イメージを指定します。
[MixedRealityController(
SupportedControllerType.WindowsMixedReality,
new[] { Handedness.Left, Handedness.Right },
"StandardAssets/Textures/MotionController")]
{ }
対話式操作マッピングを構成する
次の手順では、コントローラーでサポートされる一連の対話式操作マッピングを定義します。 Unity の Input クラスを介してデータを受信するデバイスの場合、対話式操作に割り当てる正確な軸とボタンのマッピングを確認するために、コントローラー マッピング ツールが役立ちます。
次の例は MRTK/Providers/OpenVR フォルダーにある GenericOpenVRController
クラスを省略したものです。
public override MixedRealityInteractionMapping[] DefaultLeftHandedInteractions => new[]
{
// Controller Pose
new MixedRealityInteractionMapping(0, "Spatial Pointer", AxisType.SixDof, DeviceInputType.SpatialPointer, MixedRealityInputAction.None),
// Left Trigger Squeeze
new MixedRealityInteractionMapping(1, "Trigger Position", AxisType.SingleAxis, DeviceInputType.Trigger, ControllerMappingLibrary.AXIS_9),
// Left Trigger Press (Select)
new MixedRealityInteractionMapping(2, "Trigger Press (Select)", AxisType.Digital, DeviceInputType.TriggerPress, KeyCode.JoystickButton14),
};
Note
ControllerMappingLibrary
クラスは、Unity 入力軸とボタンの定義のためのシンボル定数を指定します。
通知イベントの発生
アプリケーションがユーザーからの入力に応答できるようにするために、データ プロバイダーは IMixedRealityInputHandler
および IMixedRealityInputHandler<T>
インターフェイスで定義されているコントローラーの状態の変化に対応する通知イベントを発生させます。
デジタル タイプのコントロール (ボタン) に対しては、OnInputDown および OnInputUp イベントを発生させます。
// inputAction is the input event that is to be raised.
if (interactionSourceState.touchpadPressed)
{
InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, inputAction);
}
else
{
InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, inputAction);
}
アナログ コントロール (例: タッチパッドの位置) に対しては、InputChanged イベントを発生させる必要があります。
InputSystem?.RaisePositionInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, interactionSourceState.touchpadPosition);
Unity Profiler インストルメンテーションを追加する
Mixed Reality アプリケーションでは、パフォーマンスが重要です。 どのコンポーネントでも、ある程度のオーバーヘッドが追加されるため、アプリケーションではこれらのオーバーヘッドを考慮する必要があります。 このため、すべての入力データ プロバイダーに、内部ループと頻繁に使用されるコード パスで Unity Profiler インストルメンテーションを含めることが重要です。
カスタム プロバイダーをインストルメント化するときに MRTK によって使用されるパターンを実装することをお勧めします。
private static readonly ProfilerMarker GetOrAddControllerPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealityDeviceManager.GetOrAddController");
private async void GetOrAddController(InteractionSourceState interactionSourceState)
{
using (GetOrAddControllerPerfMarker.Auto())
{
// Code to be measured.
}
}
Note
プロファイラー マーカーを識別するために使用される名前は任意です。 MRTK では、次のパターンが使用されます。
"[製品] クラス名.メソッド名 - オプションのメモ"
トレースを分析するときに特定のコンポーネントとメソッドを簡単に識別できるようにするために、カスタム データ プロバイダーで同様のパターンに従うことをお勧めします。
プロファイルとインスペクターを作成する
Mixed Reality Toolkit では、データ プロバイダーはプロファイルを使用して構成されます。
追加の構成オプション (例: InputSimulationService) を持つデータ プロバイダーは、アプリケーションのニーズを満たすためにユーザーが挙動を変更することを可能にする、プロファイルとインスペクターを作成する必要があります。
このセクションのコード例全体は、MRTK.Services/InputSimulation フォルダーにあります。
プロファイルを定義する
プロファイルの内容には、オブザーバーのアクセス可能なプロパティ (例: 更新間隔など) を反映させる必要があります。 各インターフェイスで定義するすべてのユーザー構成可能プロパティは、プロファイルに含める必要があります。
[CreateAssetMenu(
menuName = "Mixed Reality Toolkit/Profiles/Mixed Reality Simulated Input Profile",
fileName = "MixedRealityInputSimulationProfile",
order = (int)CreateProfileMenuItemIndices.InputSimulation)]
public class MixedRealityInputSimulationProfile : BaseMixedRealityProfile
{ }
ユーザーが [Create](作成) > [Assets](アセット) > [Mixed Reality Toolkit](Mixed Reality ツールキット) > [Profiles](プロファイル) メニューを使用してプロファイル インスタンスを作成できるようにするために、CreateAssetMenu
属性をプロファイル クラスに適用できます。
インスペクターを実装する
プロファイル インスペクターは、プロファイルの内容を構成および表示するためのユーザー インターフェイスです。 各プロファイル インスペクターは、`BaseMixedRealityToolkitConfigurationProfileInspector クラスを拡張する必要があります。
[CustomEditor(typeof(MixedRealityInputSimulationProfile))]
public class MixedRealityInputSimulationProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
CustomEditor
属性により、インスペクターが適用されるアセットのタイプが Unity に通知されます。
アセンブリ定義を作成する
Mixed Reality Toolkit では、アセンブリ定義 (.asmdef) ファイルを使用してコンポーネント間の依存関係を指定し、Unity によるコンパイル時間の短縮を支援します。
すべてのデータ プロバイダーとそのエディター コンポーネントに対してアセンブリ定義ファイルを作成することをお勧めします。
前の例の[folder structure](フォルダー構造)を使用して、ContosoInput データ プロバイダーに対して 2 つの .asmdef ファイルを用意します。
最初のアセンブリ定義は、データ プロバイダー用です。 この例では ContosoInput と呼ばれ、例の ContosoInput フォルダーに配置されます。 このアセンブリ定義では、Microsoft.MixedReality.Toolkit に対する依存関係と、これが依存する他のアセンブリを指定する必要があります。
ContosoInputEditor アセンブリ定義では、プロファイル インスペクターとエディター固有のコードを指定します。 このファイルは、エディター コードのルート フォルダーに配置する必要があります。 この例では、このファイルは ContosoInput\Editor フォルダーに配置されています。 このアセンブリ定義には、ContosoInput アセンブリへの参照と次のものが含まれます。
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
データ プロバイダーを登録する
データ プロバイダーを作成したら、入力システムに登録してアプリケーションで使用することができます。
パッケージ化と配布
サード パーティ コンポーネントとして配布されるデータ プロバイダーには、パッケージ化と配布に関する特定の詳細を含めますが、この詳細は開発者の裁量に任されます。 最も一般的な解決策は、.unitypackage を生成し、Unity Asset Store を通じて配布する方法です。
データ プロバイダーが Microsoft Mixed Reality Toolkit パッケージの一部として送信され、受理されると、Microsoft MRTK チームは、それを MRTK オファリングの一部としてパッケージ化し、配布します。