Unity+C#で始める!ゼロから学ぶVRプログラミング入門

6. ハンドトラッキング&入力処理を体験しよう

コントローラの入力を取得する方法

VRコントローラーからの入力を取得するには、Input Systemパッケージを使用するのが最新の方法です。まず、以下のステップでセットアップします:

  1. Package Managerを開き、「com.unity.inputsystem」をインストール
  2. 「Project Settings」→「Player」→「Active Input Handling」を「Both」または「Input System Package」に設定
  3. エディタの再起動を求められたら再起動する

XR Interaction Toolkitでコントローラー入力を取得する基本的なスクリプト:

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.Interaction.Toolkit;

public class VRInputExample : MonoBehaviour
{
    // 入力アクションのプロパティ
    public InputActionProperty triggerAction;
    public InputActionProperty gripAction;
    public InputActionProperty primaryButtonAction;

    // Startメソッド: 入力アクションを有効にする
    private void Start()
    {
        triggerAction.action.Enable();
        gripAction.action.Enable();
        primaryButtonAction.action.Enable();
    }

    // Updateメソッド: 毎フレーム入力値をチェック
    private void Update()
    {
        // トリガーの入力値を取得 (0.0f ~ 1.0f)
        float triggerValue = triggerAction.action.ReadValue<float>();

        // グリップの入力値を取得
        float gripValue = gripAction.action.ReadValue<float>();

        // A/Xボタンが押されたかどうかをチェック
        bool isPrimaryButtonPressed = primaryButtonAction.action.IsPressed();

        // デバッグ出力
        if (triggerValue > 0.5f)
        {
            Debug.Log("トリガーが半分以上押されています: " + triggerValue);
        }

        if (isPrimaryButtonPressed)
        {
            Debug.Log("プライマリボタンが押されました!");
        }
    }
}

このスクリプトをコントローラーオブジェクト(XR Origin内のLeft/Right Hand Controller)にアタッチし、Inspectorで各アクションのプロパティを設定します。

オブジェクトを掴む/離す処理の作成

XR Interaction Toolkitを使って、オブジェクトを掴む機能を実装します:

  1. まず掴めるオブジェクトを作成:
  • Hierarchyで右クリック→「3D Object」→「Cube」などを選択
  • 作成したオブジェクトを選択してInspectorで「Add Component」→「XR」→「XR Grab Interactable」を追加
  • さらに「Rigidbody」コンポーネントも追加(「Use Gravity」にチェック)
  1. コントローラーに相互作用機能を追加:
  • XR Originの「LeftHand Controller」と「RightHand Controller」を選択
  • Inspectorで「Add Component」→「XR」→「XR Direct Interactor」を追加
  • さらに「Sphere Collider」を追加し、「Is Trigger」にチェックを入れ、「Radius」を0.1程度に設定

これだけで基本的な掴む/離す機能が実装できます。プレイモードで実行し、コントローラーのトリガーボタンを押すことでオブジェクトを掴み、離すことができます。

簡単なインタラクションの追加

押せるボタンを作成する例:

  1. ボタンオブジェクトの作成:
  • Hierarchyで右クリック→「3D Object」→「Cylinder」を選択
  • Transformの「Scale」を(0.2, 0.05, 0.2)程度に設定し、小さなボタン形状に
  • 「Rotation」のX値を90に設定して横向きに
  1. ボタンに相互作用コンポーネントを追加:
  • ボタンを選択してInspectorで「Add Component」→「XR」→「XR Simple Interactable」を追加
  1. ボタンが押されたときの処理を書くスクリプトを作成:
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class ButtonHandler : MonoBehaviour
{
    public GameObject targetObject;  // 影響を受けるオブジェクト
    public Color activatedColor = Color.green;  // ボタン押下時の色
    private Color originalColor;  // 元の色
    private MeshRenderer meshRenderer;  // 影響を受けるオブジェクトのMeshRenderer
    private XRSimpleInteractable interactable;  // ボタンとして使うインタラクタブルオブジェクト

    // Startメソッド: 初期設定
    void Start()
    {
        interactable = GetComponent<XRSimpleInteractable>();  // 現在のオブジェクトにXRSimpleInteractableをアタッチ

        // ターゲットオブジェクトのMeshRendererを取得し、元の色を保存
        if (targetObject != null)
        {
            meshRenderer = targetObject.GetComponent<MeshRenderer>();
            originalColor = meshRenderer.material.color;
        }

        // ボタンが押されたとき、離されたときにイベントリスナーを登録
        interactable.selectEntered.AddListener(OnButtonPressed);  // ボタンが押されたとき
        interactable.selectExited.AddListener(OnButtonReleased);  // ボタンが離されたとき
    }

    // ボタンが押されたときに呼ばれるメソッド
    public void OnButtonPressed(SelectEnterEventArgs args)
    {
        if (meshRenderer != null)
        {
            // ターゲットオブジェクトの色を変更
            meshRenderer.material.color = activatedColor;
            Debug.Log("ボタンが押されました!");
        }
    }

    // ボタンが離されたときに呼ばれるメソッド
    public void OnButtonReleased(SelectExitEventArgs args)
    {
        if (meshRenderer != null)
        {
            // 元の色に戻す
            meshRenderer.material.color = originalColor;
            Debug.Log("ボタンが離されました");
        }
    }
}
  1. このスクリプトをボタンにアタッチし、Inspectorで「Target Object」に色を変えたいオブジェクトをドラッグ&ドロップ

このように、XR Interaction Toolkitを活用することで、シンプルなコードでもさまざまなVRインタラクションを実装できます。

7. よくあるトラブルとその対処法

再生されない/表示されない/動かない原因例

VR開発では様々なトラブルに遭遇することがありますが、代表的な問題と解決策を紹介します:

1. VRカメラが動かない・表示されない

  • 原因1: XR Pluginが正しく初期化されていない
  • 解決策: Project Settings→XR Plugin Managementで正しいプラグインが有効になっているか確認
  • 原因2: XR Originの設定ミス
  • 解決策: Hierarchyに正しくXR Originが配置されているか確認

2. コントローラーが表示されない

  • 原因1: コントローラーモデルがアタッチされていない
  • 解決策: XR Originの子オブジェクトとして左右のコントローラーが存在するか確認
  • 原因2: Input Systemの設定ミス
  • 解決策: Project Settings→Playerで「Active Input Handling」が「Both」または「Input System Package」になっているか確認

3. オブジェクトとの相互作用ができない

  • 原因1: Colliderの設定ミス
  • 解決策: インタラクターとインタラクタブルの両方に適切なColliderが設定されているか確認
  • 原因2: レイヤー設定の問題
  • 解決策: オブジェクトが無視されるレイヤーに入っていないか確認

4. パフォーマンスが悪い

  • 原因1: ポリゴン数やテクスチャサイズが大きすぎる
  • 解決策: Asset Importerの設定でモデルやテクスチャを最適化
  • 原因2: 不要なコンポーネントやスクリプト
  • 解決策: Profilerを使って負荷の高い処理を特定し最適化

Androidビルド時の注意点

Meta Quest向けなどのAndroidビルドでは特に注意が必要です:

  1. 開発者登録とデバイス設定:
  • Meta Questでは開発者アカウント登録が必要
  • デバイスの開発者モードを有効化
  • USBデバッグを有効化
  1. ビルド設定:
  • Player Settings→Other Settings→Package Nameを適切に設定(例: com.yourcompany.vrapp)
  • Minimum API Levelが29以上であることを確認
  • Auto Graphics APIのチェックを外し、OpenGLES3のみを使用