HeadwornのシーンをDRFに対応させる方法
このページ では、機能サンプル等のHeadwornで動作することを前提としたシーンを、DRFで動作させる方法を紹介します。
セットアップ手順
1. DRFに必要なオブジェクトの追加
-
以下のDRF用のシーンを開きます。
Assets/Samples/Snapdragon Spaces/X.X.X/Fusion Samples/Scenes/ControllerPrefabSampleScene

-
上記のDRF用のシーン内で、以下のオブジェクトをCopyします。
Fusion InteractionFusion Scene ManagerDynamic OpenXR Loader

-
DRFに対応させたいHeadwornのシーンを開き、CopyしたオブジェクトをPasteします。

一部サンプルにおいてはHost Viewもコピーしないと、SpacesLifecycleEvents.OnEnableでNullReferenceが発生します。
上記エラーが発生する場合は下記画像のように手順2のシーンからHost Viewを追加でコピー・配置してください。

2. SpacesLifecycleEventsの設定
Fusion Scene Managerオブジェクトを選択します。SpacesLifecycleEventsコンポーネントで、以下の設定を行います。On OpenXR Unavailable()に、以下のオブジェクトをGameObject.SetActiveのチェックを無効にして登録します。UISample AssetsXR Origin (XR Rig)
On OpenXR Started()に、以下のオブジェクトをGameObject.SetActiveのチェックを有効にして登録します。UISample AssetsXR Origin (XR Rig)

上記の手順を行うことで、On OpenXR Unavailable()の場合にゲームオブジェクトは非アクティブになり、On OpenXR Started()の場合にゲームオブジェクトはアクティブになります。
- 「グラスがスマホと接続される前」→「OpenXRが利用不可」→「
On OpenXR Unavailable()」 - 「グラスがスマホと接続された後」→「OpenXRが起動した後」→「
On OpenXR Started()」
それぞれのゲームオブジェクトについての補足
XR Origin (XR Rig):グラスと接続されていない場合は、Main Cameraは不要なので非アクティブにします。UI:UIをMain Cameraに追従させる機能を動作させるために、Main Cameraがアクティブになってから、UIのオブジェクトをアクティブにする必要があります。Sample Assets:カメラへのアクセス等の権限の取得が完了し、グラスのセンサーを使用した機能が利用可能になるのを待つために、グラスと接続された後にオブジェクトをアクティブにする必要がある場合があります。
上記は機能サンプルのシーンを元にする場合の説明です。Headwornのシーンによっては、シーン構造が異なる可能性があります。
その場合でも、基本的にはHeadwornのシーンに元々あったオブジェクトを、同じようにSpacesLifecycleEventsコンポーネントで設定を行えば問題ありません。
※AR SessionオブジェクトやSpaces XR Simulatorオブジェクトは、特に設定を行う必要はありません。
3. Headworn用のポインターの削除
XR Origin (XR Rig)/Camera Offset/Spaces Simple Interaction/Controller Manager/Host Controller Pointerオブジェクトを削除します。

削除後にエラーが発生する場合はAssets/Samples/Snapdragon Spaces/X.X.X/Core Samples/Shared Assets/Scripts/Interaction/XRControllerManager.csのファイルに対して次のように変更を加えてください。
public void ActivateController(XRControllerProfile xrControllerProfile)
{
_xrControllerProfile = xrControllerProfile;
switch (xrControllerProfile)
{
case XRControllerProfile.XRControllers:
{
if (HostController != null) HostController.SetActive(false);
XRControllers.SetActive(true);
break;
}
default:
{
XRControllers.SetActive(false);
if (HostController != null) HostController.SetActive(false);
break;
}
}
}
4. Triger Actionの変更
Headworn用のシーンのUIは基本的には、DRF用のポインターでも操作出来ます。 しかし、空間アンカーのようにUI以外の操作にポインターを使用する場合は、設定を変更する必要があります。
Sample Assets/XXX Sample Controllerオブジェクトを選択します。AnchorSampleControllerコンポーネントのTrigger Actionを以下のInput Actionに変更します。Controller Prefab/Select (Input Action Reference)
DRF用のポインターが使用するInput Actionについては以下の手順で確認できます。
Hierarchy内の以下のオブジェクトを選択します。Fusion Interaction/Canvas Controller/Controller Position Head Mirror/Controller Relative Position/Pointer/Device Pointer
XR ControllerコンポーネントのSelect Action内で参照しているInput Actionを左クリックします。

5. 権限の要求
「カメラへのアクセス」や「ネットワークへアクセス」の権限を必要とするシーンの場合、DRF用の方法で権限を要求する必要があります。
- 以下のような権限を要求するスクリプトを作成します。(例として、カメラへのアクセス権限を要求する場合)
using UnityEngine;
using UnityEngine.Android;
public class RequestCameraPermission : MonoBehaviour
{
private void Awake()
{
if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
{
Permission.RequestUserPermission(Permission.Camera);
}
}
}
- 作成したスクリプトを適当なオブジェクトにアタッチします。
