6. ハンドトラッキング&入力処理を体験しよう
コントローラの入力を取得する方法
VRコントローラーからの入力を取得するには、Input Systemパッケージを使用するのが最新の方法です。まず、以下のステップでセットアップします:
- Package Managerを開き、「com.unity.inputsystem」をインストール
- 「Project Settings」→「Player」→「Active Input Handling」を「Both」または「Input System Package」に設定
- エディタの再起動を求められたら再起動する
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を使って、オブジェクトを掴む機能を実装します:
- まず掴めるオブジェクトを作成:
- Hierarchyで右クリック→「3D Object」→「Cube」などを選択
- 作成したオブジェクトを選択してInspectorで「Add Component」→「XR」→「XR Grab Interactable」を追加
- さらに「Rigidbody」コンポーネントも追加(「Use Gravity」にチェック)
- コントローラーに相互作用機能を追加:
- XR Originの「LeftHand Controller」と「RightHand Controller」を選択
- Inspectorで「Add Component」→「XR」→「XR Direct Interactor」を追加
- さらに「Sphere Collider」を追加し、「Is Trigger」にチェックを入れ、「Radius」を0.1程度に設定
これだけで基本的な掴む/離す機能が実装できます。プレイモードで実行し、コントローラーのトリガーボタンを押すことでオブジェクトを掴み、離すことができます。
簡単なインタラクションの追加
押せるボタンを作成する例:
- ボタンオブジェクトの作成:
- Hierarchyで右クリック→「3D Object」→「Cylinder」を選択
- Transformの「Scale」を(0.2, 0.05, 0.2)程度に設定し、小さなボタン形状に
- 「Rotation」のX値を90に設定して横向きに
- ボタンに相互作用コンポーネントを追加:
- ボタンを選択してInspectorで「Add Component」→「XR」→「XR Simple Interactable」を追加
- ボタンが押されたときの処理を書くスクリプトを作成:
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("ボタンが離されました");
}
}
}- このスクリプトをボタンにアタッチし、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ビルドでは特に注意が必要です:
- 開発者登録とデバイス設定:
- Meta Questでは開発者アカウント登録が必要
- デバイスの開発者モードを有効化
- USBデバッグを有効化
- ビルド設定:
- Player Settings→Other Settings→Package Nameを適切に設定(例: com.yourcompany.vrapp)
- Minimum API Levelが29以上であることを確認
- Auto Graphics APIのチェックを外し、OpenGLES3のみを使用
