はじめに
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)を利用してプロジェクトを構築していきます。
iOSにスイッチ
Project Settings の 「Player」の修正
-
Override Default Bundle Identifier のチェックを外す
-
Api Compatibility Level を「.NET Framework」に変更
XR Plugin Management のインストール
「Install XR Plugin Management」をクリック
ARKit のインストール
Unity Editorの再起動
Face Tracking を利用する場合はチェック
URPプロジェクトのための設定
Project Settings の 「Graphics」の修正
Project Settings の 「Quality」の修正
Project ウインドウ Assets > Settings の「URP-Balanced-Renderer.asset」の修正
「Add Renderer Feature」をクリックして、「AR Background Renderer Feature」を追加
XR Interaction Toolkit のインストール
ARKitをインストールすることで、自動的にAR Foundationもインストールされる
XR Interaction Toolkitの「Install」をクリック
シーン構築
AR Session、XR Origin (AR) をシーンに追加
XR Origin (AR) を追加するタイミングで、「XR Interaction Manager」も追加される
シーン作成時に存在したMain Cameraを削除
XR Origin (XR Rig) > Camera Offset に AR用の Main Cameraが存在するため、作成時のMain Cameraは不要
Main Camera に「AR Gesture Interactor」を追加
XR Origin (XR Rig) に「AR Plane Manager」「AR Ray Cast Manager」を追加
平面検知用の平面Prefabの作成
- AR Default Planeを Hierachyウインドウに追加
- Projectウインドウにドラック&ドロップすることで、Prafabを作成
- HierachyウインドウのAR Default Planeを削除
AR Plane Manager に 「AR Default Plane」を設定
XR Interaction Managerに「AR Placement Interactable」を追加
タップで配置する3Dオブジェクトの設定とPrafab化
オブジェクトに対して、コライダーの設置が別途必要です
- AR Selection Interactable、AR Translation Interactable、AR Rotation Interactable、AR Scale Interactable を追加
AR Selection Interactable(選択/解除)、AR Translation Interactable(移動)、AR Rotation Interactable(回転)、AR Scale Interactable(縮小/拡大) と Main Camera に設定したAR Gesture Interactor により、オブジェクトの選択、移動、回転、縮小・拡大が実現されます
- Projectウインドウにドラック&ドロップすることで、Prafabを作成
- HierachyウインドウのPrefab化した3Dオブジェクトを削除を削除
AR Placement Interactableに タップで配置する3Dオブジェクトを設定
Interactionを試すスクリプトを作成
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
結果