開発

コントローラーインプットとトラッキングの概要

更新日時: 2026/02/13
コントローラーは、ユーザーがUnity XRアプリのエクスペリエンスとやり取りするための使いやすいインターフェイスを提供します。ボタンを押す、ジョイスティックを動かすなどのユーザー入力を受け入れ、ユーザーの手の動きをトラッキングします。
OVRInputは、Meta Quest Touchコントローラー用に設計された、Unityでのコントローラー入力とトラッキングのためのMetaの統一APIです。リアルタイムデータにアクセスするためのインターフェイスを提供します。
  • コントローラーの状態、ボタン、サムスティック、トリガー、静電容量式タッチ
  • 手とコントローラーのポーズ
Use Unity's Input System
新しいプロジェクトの場合は、OVRInputの代わりにUnityのInput Systemパッケージを使ってください。OVRInputはレガシーサポートのために維持されていますが、新しい機能やデバイスはUnityのInput Systemでのみ利用可能な場合があります。
オブジェクトをつかむ、シーン内を移動する、ユーザーインターフェイスを設定するなど、コントローラーベースのインタラクションを追加するプロセスについて詳しくは、Interaction SDKの概要をご覧ください。

設定

  1. OVRInputを使うには、UnityプロジェクトにMeta XR Interaction SDKをインストールする必要があります。詳細な手順のガイドについては、Interaction SDKを設定するをご覧ください。
  2. その後、シーン内の任意の場所にOVRManager prefabを配置します。これにより、デバイス状態と入力アップデートが管理されます。
  3. 入力またはゲームロジックを処理するスクリプトで、すべてのUpdateメソッドとFixedUpdateメソッドの開始時に、1フレームごとにOVRInput.Update()OVRInput.FixedUpdate()をそれぞれ追加します。以下はその例です。
    public class XRInputManager : MonoBehaviour {
        void Update() {
            OVRInput.Update();
            // Handle input logic here
        }
        void FixedUpdate() {
            OVRInput.FixedUpdate();
            // Handle physics-based input here
        }
    }
    
    : OVRInputの更新メソッドを呼び出す際には、以下のベストプラクティスに従ってください。
    • 状態の一貫性を確保するため、更新機能の呼び出しをメインの入力マネージャスクリプトに集中化します。
    • 入力状態に依存する他のスクリプトより先に、更新関数の呼び出しを行います。
    • プロジェクトで複数のシーンを使う場合、入力マネージャがすべてのシーンに含まれていることを確認してください。
  4. OVRInputを含めると、システムは自動的に入力バインディングを追加します。これは、コントローラーアクションがUnityにどのようにマッピングされるかを定義します。これらはプロジェクトのInputManager.asset構成ファイルで参照できます。
詳しくは、OVRInput APIリファレンスのドキュメントをご覧ください。

しくみ

以下のセクションでは、OVRInputを使用してコントローラーとトラッキングデータを取得する方法について説明します。

入力のクエリ

OVRInputには、コントローラーの状態をクエリするための以下のようなメソッドがあります。
  • Get(): ボタン、軸、タッチセンサーの現在の状態を返します
  • GetDown(): ボタンがこのフレームで押されたかどうかを返します
  • GetUp(): ボタンがこのフレームで離されたかどうかを返します
例えば、次のコードは、現在のフレームで右コントローラーのトリガーが押されたかどうかをチェックします。
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch)) {
    // Trigger pressed on right controller
}

コントローラーのポーズをトラッキングする

OVRInputは、初期のセンターアイポーズを基準とした、ヘッドセットと同じフレーム内のコントローラーポーズを報告します。ポーズは、低遅延のレンダリングのためにヘッドセットと同期して予測されます。
OVRManager.display.RecenterPose()を使用して、コントローラーとヘッドセットのポーズを現在の位置にリセットします。
OVRInputは、次のポーズトラッキング機能を提供します。
  • GetLocalControllerPosition(): 位置をVector3で返します
  • GetLocalControllerRotation(): 向きをQuaternionで返します

コントローラー識別

OVRInputでは、Meta Quest Touchコントローラーに以下の指定を使用します。
  • Primary: 左コントローラー
  • Secondary: 右コントローラー

コントロール入力の列挙

OVRInputには、異なるコントロールセットにアクセスするためのGet()のバリエーションが用意されています。以下が含まれます。
コントロール列挙
OVRInput.Button
ゲームパッドやコントローラーに付いた従来型のボタン、戻るボタン。
OVRInput.Touch
コントローラーの静電容量反応式コントロールサーフェス。
OVRInput.NearTouch
コントローラーの接近反応式コントロールサーフェス。
OVRInput.Axis1D
浮動小数点の状態を報告するトリガーなどの、1次元コントロール。
OVRInput.Axis2D
サムスティックなどの2次元コントロール。Vector2の状態を報告します。
列挙の2番目のセットは1番目のセットをミラーリングし、以下のように定義されます。
コントロール
OVRInput.RawButton
OVRInput.RawTouch
OVRInput.RawNearTouch
OVRInput.RawAxis1D
OVRInput.RawAxis2D
列挙の1番目のセットは、バーチャル化された入力マッピングを提供し、開発者がさまざまなタイプのコントローラー上で動作するコントロールスキームを作成できるようにするためのものです。仮想マッピングには、以下のセクションで説明するような便利な機能があります。
列挙の2番目のセットは、コントローラーの基本的な状態への未加工のアクセスを提供します。

ボタン、タッチ、ニアタッチ

従来のゲームパッドボタンに加え、コントローラーはユーザーの指が物理的に接触(Touch)、そして接近(NearTouch)したことを感知する静電容量反応式コントロールサーフェスを備えています。これにより、特定のコントロールサーフェスとのユーザーのインタラクションの複数の状態を明確に感知することができます。例えば、ユーザーの人差し指がコントロールサーフェスから完全に離れたとき、そのコントロールのNearTouchはfalseを報告します。ユーザーの指がコントロールに近づき、接近した状態になると、指が物理的に接触する前にNearTouchはtrueを報告します。ユーザーが物理的に接触すると、そのコントロールのTouchはtrueを報告します。ユーザーがインデックストリガーを押すと、そのコントロールのButtonはtrueを報告します。明確に区別されるこれらの状態は、ユーザーとコントローラーのインタラクションを正確に感知し、さまざまなコントロールスキームを可能にします。

使用例

次の例は、ボタン、サムスティック、トリガー、静電容量式タッチセンサーなど、さまざまな入力タイプのクエリ方法を示しています。
// returns true if the primary button (typically “A”) is currently pressed.
OVRInput.Get(OVRInput.Button.One);

// returns true if the primary button (typically “A”) was pressed this frame.
OVRInput.GetDown(OVRInput.Button.One);

// returns true if the “X” button was released this frame.
OVRInput.GetUp(OVRInput.RawButton.X);

// returns a Vector2 of the primary (typically the Left) thumbstick’s current state.
// (X/Y range of -1.0f to 1.0f)
OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);

// returns true if the primary thumbstick is currently pressed (clicked as a button)
OVRInput.Get(OVRInput.Button.PrimaryThumbstick);

// returns true if the primary thumbstick has been moved upwards more than halfway.
// (Up/Down/Left/Right - Interpret the thumbstick as a D-pad).
OVRInput.Get(OVRInput.Button.PrimaryThumbstickUp);

// returns a float of the secondary (typically the Right) index finger trigger’s current state.
// (range of 0.0f to 1.0f)
OVRInput.Get(OVRInput.Axis1D.SecondaryIndexTrigger);

// returns a float of the left index finger trigger’s current state.
// (range of 0.0f to 1.0f)
OVRInput.Get(OVRInput.RawAxis1D.LIndexTrigger);

// returns true if the left index finger trigger has been pressed more than halfway.
// (Interpret the trigger as a button).
OVRInput.Get(OVRInput.RawButton.LIndexTrigger);

// returns true if the secondary gamepad button, typically “B”, is currently touched by the user.
OVRInput.Get(OVRInput.Touch.Two);
Get()は、コントロールを指定するだけでなく、任意のコントローラーパラメーターも取得します。サポートされるコントローラーのリストは、OVRInputのコントローラーのリストのセクションで定義されています。
特定のコントロールスキームがあるコントロールタイプでのみ使用される場合、コントローラーの指定ができます。Get()にコントローラーパラメーターを指定しない場合、最後にユーザー入力を報告したActiveコントローラーがデフォルトで使用されます。例えば、ユーザーがコントローラーのペアを使用しているときに、それを下に置き、Xboxコントローラーを手に取ると、ユーザーが入力を提供したときにアクティブコントローラーがXboxコントローラーへと切り替わります。現在のアクティブなコントローラーのクエリには<OVRInput.GetActiveController()を使用でき、接続されているすべてのコントローラーのビットマスクのクエリにはOVRInput.GetConnectedControllers()を使用できます。
次の例は、組み合わせたコントローラーペアを明示的に指定して、左右のハンドトリガーをクエリする方法を示しています。
// returns a float of the hand trigger's current state on the left controller.
OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger, OVRInput.Controller.Touch);

// returns a float of the hand trigger's current state on the right controller.
OVRInput.Get(OVRInput.Axis1D.SecondaryHandTrigger, OVRInput.Controller.Touch);
: Meta Quest Touchコントローラーは(OVRInput.Controller.Touchを使用して)組み合わせたペアとして指定することも、(OVRInput.Controller.LTouchRTouchを使用して)個別に指定することもできます。LTouchRTouchかを指定することでバーチャル入力マッピングの異なるセットが使用され、手に依存しない入力コードの開発がさらに便利になるので、これは重要です。
次の例は、PrimaryHandTriggerを個々のコントローラーで使うことにより、手の関与しないインプットを示しています。ここで、Primaryは常に指定された手にマッピングされます。
// returns a float of the hand trigger's current state on the left controller.
OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger, OVRInput.Controller.LTouch);

// returns a float of the hand trigger's current state on the right controller.
OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger, OVRInput.Controller.RTouch);
このアプローチを拡張すると、パブリック変数など外部で設定される変数にコントローラーを指定することで、同じコードをどちらの手にも使用することが可能になります。
次の例は、コントローラーを構成可能な変数として公開することで、再利用可能な入力コードを記述する方法を示しています。
// public variable that can be set to LTouch or RTouch in the Unity Inspector
public OVRInput.Controller controller;

// returns a float of the hand trigger’s current state on the controller
// specified by the controller variable.
OVRInput.Get(OVRInput.Axis1D.PrimaryHandTrigger, controller);

// returns true if the primary button (“A” or “X”) is pressed on the controller
// specified by the controller variable.
OVRInput.Get(OVRInput.Button.One, controller);
これにより、左右の手の入力マッピングのif/elseチェックにおける一般的なパターンを回避できます。

Touchの入力マッピング

以下の図はコントローラーの一般的な入力マッピングを示します。利用できる追加のマッピングについては、OVRInput APIリファレンスドキュメントをご覧ください。

複合コントローラーの仮想マッピング

OVRInput.Controller.Touchでコントローラーに組み合わせたペアとしてアクセスする場合、バーチャルマッピングは左右の手に分けられた典型的なゲームパッドのレイアウトとほぼ一致しています。
Combined controller mapping diagram

個別コントローラーのバーチャルマッピング

左右のコントローラーに、それぞれOVRInput.Controller.LTouchまたはOVRInput.Controller.RTouchでアクセスする場合、バーチャルマッピングが変わり、手に依存しない入力バインディングが可能になります。例えば、どの手に装着されているかに応じて、同じスクリプトが動的に左または右のコントローラーをクエリできます。Button.Oneは状況に応じてAまたはXボタンにマッピングされます。
Individual controller mapping diagram

ローマッピング

ローマッピングはコントローラーを直接公開します。コントローラーのレイアウトは、左右の手に分けられた一般的なゲームパッドのレイアウトとほぼ一致しています。
Raw controller mapping diagram

詳しくはこちら

UnityのXRアプリでのコントローラーの使用について詳しくは、次のガイドをご覧ください。

デザインガイドライン

  • 入力モダリティ: さまざまな入力モダリティについて学びます。
  • ヘッド: ヘッド入力を使用するための設計とUXのベストプラクティスについて学びます。
  • : 手を使用するための設計とUXのベストプラクティスについて学びます。
  • コントローラー: コントローラーを使用するための設計とUXのベストプラクティスについて学びます。
  • 音声: 音声を使用するための設計とUXのベストプラクティスについて学びます。
  • 周辺機器: 周辺機器を使うための設計とUXのベストプラクティスについて学びます。
ナビゲーションロゴ
日本語
© 2026 Meta