LoginSignup
1
1

Unity AR Foundation で XR Interaction Toolkit を利用する

Last updated at Posted at 2023-10-09

はじめに

AR Foundationで、XR Interaction Toolkitを利用することに挑戦してみました。
AR Foundation も 4系と5系で、クラス名など変更がありましたので環境構築から記載していきます。

環境

  • Unity 2022.3.10
  • AR Foundation 5.0.7
  • Apple ARKit XR Plugin 5.0.7
  • XR Interaction Toolkit 2.5.2

環境構築

Unity Projectの作成

Universal Render Pipeline(URP)を利用してプロジェクトを構築していきます。
スクリーンショット 2023-10-09 9.08.36.png

iOSにスイッチ

「Switch Platform」をクリック
スクリーンショット 2023-10-09 9.13.50.png

Project Settings の 「Player」の修正

  • Company Name
    スクリーンショット 2023-10-09 9.15.37.png

  • Override Default Bundle Identifier のチェックを外す

  • Api Compatibility Level を「.NET Framework」に変更

  • Camera Usage Description : アプリを起動する際に表示されるカメラを利用する旨の説明文
    スクリーンショット 2023-10-09 9.17.53.png

XR Plugin Management のインストール

「Install XR Plugin Management」をクリック
スクリーンショット 2023-10-09 9.18.54.png

ARKit のインストール

ARKitをチェック
スクリーンショット 2023-10-09 9.20.52.png

Unity Editorの再起動

スクリーンショット 2023-10-09 9.21.08.png

Face Tracking を利用する場合はチェック

スクリーンショット 2023-10-09 9.23.33.png

URPプロジェクトのための設定

Project Settings の 「Graphics」の修正

  • Scripting Render Pipeline Setting
    スクリーンショット 2023-10-09 15.11.19.png

Project Settings の 「Quality」の修正

  • Levelsの「Balanced」をクリック
    スクリーンショット 2023-10-09 15.11.38.png

Project ウインドウ Assets > Settings の「URP-Balanced-Renderer.asset」の修正

スクリーンショット 2023-10-09 9.50.32.png

「Add Renderer Feature」をクリックして、「AR Background Renderer Feature」を追加
スクリーンショット 2023-10-09 9.51.22.png

XR Interaction Toolkit のインストール

ARKitをインストールすることで、自動的にAR Foundationもインストールされる

XR Interaction Toolkitの「Install」をクリック
スクリーンショット 2023-10-09 9.30.03.png

シーン構築

AR Session、XR Origin (AR) をシーンに追加

XR Origin (AR) を追加するタイミングで、「XR Interaction Manager」も追加される

スクリーンショット 2023-10-09 11.36.19.png
スクリーンショット 2023-10-09 11.38.43.png

シーン作成時に存在したMain Cameraを削除

XR Origin (XR Rig) > Camera Offset に AR用の Main Cameraが存在するため、作成時のMain Cameraは不要

スクリーンショット 2023-10-09 11.39.11.png

Main Camera に「AR Gesture Interactor」を追加

スクリーンショット 2023-10-09 11.44.55.png

  • Interaction Manager に「XR Interaction Manager」を設定
    スクリーンショット 2023-10-09 11.45.46.png

XR Origin (XR Rig) に「AR Plane Manager」「AR Ray Cast Manager」を追加

平面に3Dオブジェクトを配置するために利用する
スクリーンショット 2023-10-09 11.54.06.png

平面検知用の平面Prefabの作成

  1. AR Default Planeを Hierachyウインドウに追加
  2. Projectウインドウにドラック&ドロップすることで、Prafabを作成
  3. HierachyウインドウのAR Default Planeを削除
    スクリーンショット 2023-10-09 11.57.16.png

AR Plane Manager に 「AR Default Plane」を設定

スクリーンショット 2023-10-09 11.59.20.png

XR Interaction Managerに「AR Placement Interactable」を追加

スクリーンショット 2023-10-09 12.03.21.png

  • Interaction Manager に「XR Interaction Manager」を設定
    スクリーンショット 2023-10-09 12.04.22.png

タップで配置する3Dオブジェクトの設定とPrafab化

オブジェクトに対して、コライダーの設置が別途必要です

  • AR Selection Interactable、AR Translation Interactable、AR Rotation Interactable、AR Scale Interactable を追加
    スクリーンショット 2023-10-09 12.18.40.png

AR Selection Interactable(選択/解除)、AR Translation Interactable(移動)、AR Rotation Interactable(回転)、AR Scale Interactable(縮小/拡大) と Main Camera に設定したAR Gesture Interactor により、オブジェクトの選択、移動、回転、縮小・拡大が実現されます

スクリーンショット 2023-10-09 23.07.51.png

  1. Projectウインドウにドラック&ドロップすることで、Prafabを作成
  2. HierachyウインドウのPrefab化した3Dオブジェクトを削除を削除

AR Placement Interactableに タップで配置する3Dオブジェクトを設定

  • Placement Prafab
    スクリーンショット 2023-10-09 23.22.14.png

Interactionを試すスクリプトを作成

XRInteractionSample.cs
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.XR.Interaction.Toolkit.AR;


public class XRInteractionSample : MonoBehaviour
{
    [SerializeField] private ARPlaneManager _planeManager;
    [SerializeField] private ARPlacementInteractable _placementInteractable;

    private GameObject _placedObject;
    
    private void OnEnable()
    {
        // イベントの登録
        _placementInteractable.objectPlaced.AddListener(ObjectPlaced);
        _placementInteractable.hoverEntered.AddListener(HoverEntered);
        _placementInteractable.hoverExited.AddListener(HoverExited);
    }

    private void ObjectPlaced(ARObjectPlacementEventArgs arg0)
    {
        if (_placedObject is not null)
        {
            Destroy(arg0.placementObject);
            return;
        }
        
        _placedObject = arg0.placementObject;
        
        ARSelectionInteractable selectionInteractable =  _placedObject.GetComponent<ARSelectionInteractable>();
        if (selectionInteractable is not null)
        {
            // イベントを登録
            selectionInteractable.selectEntered.AddListener(SelectEntered);
            selectionInteractable.selectExited.AddListener(SelectExited);
        }
    }

    private void HoverEntered(HoverEnterEventArgs arg0)
    {
        // インタラクタがインタラクタブルを選択できる状態を開始した時
        // NOP
    }

    private void HoverExited(HoverExitEventArgs arg0)
    {
        // インタラクタがインタラクタブルを選択できる状態を終了した時
        // NOP
    }
    
    private void SelectEntered(SelectEnterEventArgs arg0)
    {
        // インタラクタがインタラクタブルを選択した時
        // NOP
    }

    private void SelectExited(SelectExitEventArgs arg0)
    {
        // インタラクタがインタラクタブルを選択を終了した時
        _placedObject.GetComponent<Rigidbody>().isKinematic = false;
    }

    // Update is called once per frame
    void Update()
    {
        foreach (ARPlane plane in _planeManager.trackables)
        {
            // 検出した平面を非表示にする
            plane.gameObject.SetActive(false);
        }
    }
}

XR Interaction Managerにスクリプトを追加

  • Plane Manager
  • Placement Iteractable

スクリーンショット 2023-10-09 23.51.55.png

結果

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1