🌊

AR開発で使用するXRInteractionToolkit

2023/06/12に公開

XRInteractionToolKitはVR開発でよく使用されるイメージですが、AR開発でも使用可能なので試してみました。

はじめに

ARFoundationとXRInteractionToolKitを使用して、AR開発環境を構築してください。詳細は割愛いたします。

XRInteractionToolKitの構成要素

  • Interactor
    オブジェクトを操作するインタラクションそのもの)
  • Interactable
    インタラクションによって操作されるオブジェクトのこと
  • Interaction Manager
    InteractorとInteractalbeを管理するマネージャークラス。

SceneにXR->Interaction ManagerでXR Interaction Managerを作成。
もしくは、XRInteractionManagerスクリプトをGameObjectにアタッチ。

ARGestureInteractor

ARGestureInteractorをどこかのGameObjectにアタッチして使用します。
おそらく、XRInteraction ToolKitのARにおけるInteractorはこの一つのみです。
ARGestureInteractorはHoverとSelectの始まりと終わりの際にイベントを取得できます。
もちろん、Inspectorからも設定できます。

[SerializeField] private ARGestureInteractor _arGestureInteractor;
    void Awake()
    {
        _arGestureInteractor.onHoverEntered.AddListener(OnHoverEnter);
        _arGestureInteractor.onHoverExited.AddListener(OnHoverExit);
        _arGestureInteractor.onSelectEntered.AddListener(OnSelectEnter);
        _arGestureInteractor.onSelectExited.AddListener(OnSelectExit);
        
    }

    private void OnSelectEnter(XRBaseInteractable arg0)
    {
    // 選択開始
    }

    private void OnSelectExit(XRBaseInteractable arg0)
    {
    // 選択終了
    }

    private void OnHoverExit(XRBaseInteractable arg0)
    {
    // ホバー開始
    }
    
    private void OnHoverEnter(XRBaseInteractable arg0)
    {
    // ホバー終了
    }

現時点でARGestureInteractorにARSessionOriginをセットする必要があるのですが、これは今後サポートされなくなるそうです。ARGestureInteractorはTapGestureやPinchGestureなどの情報を取得できるのでジェスチャーの数値によって挙動をカスタムすることができます。
https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/api/UnityEngine.XR.Interaction.Toolkit.AR.ARGestureInteractor.html

DragGestureRecognizer(一本指でのドラッグ動作)
https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/api/UnityEngine.XR.Interaction.Toolkit.AR.DragGestureRecognizer.html

PinchGestureRecognizer(二本指でのピンチ動作)
https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/api/UnityEngine.XR.Interaction.Toolkit.AR.PinchGestureRecognizer.html

TapGestureRecognizer(スクリーンタップ)
https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/api/UnityEngine.XR.Interaction.Toolkit.AR.TapGestureRecognizer.html

TwistGesture(二本指で捻る動作)
https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/api/UnityEngine.XR.Interaction.Toolkit.AR.TwistGesture.html

TwoFingerDragGesture(二本指でドラッグ)
https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/api/UnityEngine.XR.Interaction.Toolkit.AR.TwoFingerDragGesture.html

これらのジェスチャーはGestureRecognizerが提供されており、それぞれのジェスチャー開始Actionを追加することができます。

dragGestureRecognizer.onGestureStarted += 〇〇;
pinchGestureRecognizer.onGestureStarted += 〇〇;
tapGestureRecognizer.onGestureStarted += 〇〇;
twoFingerDragGestureRecognizer.onGestureStarted += 〇〇;
twistGestureRecognizer.onGestureStarted += 〇〇;

ARSelectionInteractable

オブジェクトを選択/解除したい時に使用する

  • 注意点
    後述のAR〇〇Interactableはオブジェクトを選択して、回転させたり、移動することが前提になっているのでARSelectionInteractableとAR〇〇Interactlbleはセットで利用することが前提となっています。つまり選択状態でなければ回転や拡大縮小もできない仕様になっています。

ARTranslationInteractable

移動したいオブジェクトにアタッチして使用します。このInteractableはとても紛らわしいのです。このInteractableはPlaneを軸に移動することが前提となっています。そのため、後述のAR Placement Interactableで配置されたオブジェクトでしか作用しません。このスクリプトをアタッチしたすべてのオブジェクトがジェスチャーで自由自在に移動できるわけではないことに注意です。

ARScaleInteractable ARRotationInteractable

拡大縮小したいオブジェクトにアタッチして使用します。
回転したいオブジェクトにアタッチして使用します。

これら全てのInteractableは設定はほとんど同じです。違う部分としてはどれほどの回転を許すか、どれくらいの拡大率に制限させるかのみです。
以下、共通の設定です。

  • Colliders
    インタラクションが発生した際に作用させるColliderのリスト。何も設定していないと自動で、Interactableの子オブジェクトも含んだcollider全てに影響する設定になっている。

  • Interaction Layer Mask
    インタラクターがインタラクタブルにインタラクションをする際にフィルタリングの仕組み。このインタラクションレイヤーが共通していないとお互いにインタラクションされない。

  • SelectMode
    同時に複数のInteractorを作用させるか、しないかの選択。

  • Exclude UI Touches
    スクリーンの前にCanvasがある場合、UIのタッチを無視してインタラクションを優先するかしないか

  • Interactable Events
    でHoverやSelect時に発火するイベントを選択できます。一番使用しそうです。

  • Selection Visualization
    選択した時に、セットしたGameObjectのSetActive(true)を呼び出します。選択した3Dオブジェクトをわかりやすくユーザーに提示するために便利そうです。

ARPlacementInteractable

どこかのGameObjectにアタッチして、placementPrefabを設定することで指定したPrefabを配置できます。Inspector上からPlacmentPrefabに配置したいPrefabを設定します。

  • 注意点 ARPlaneManagerとARRaycastManagerを前提としてInteractableです。ARSessionOriginに二つともアタッチしないと使用できません。

placementInteractableでは配置されたタイミングをコールバックで受け取ることができます。

[SerializeField] private ARPlacementInteractable arPlacementInteractable;
private void Start()
{
	arPlacementInteractable.objectPlaced.AddListener(ObjectPlaced);
}
 private void ObjectPlaced(ARObjectPlacementEventArgs arg0) { }

Discussion