UIの追従
UIをグラスの向きに追従
UIをグラスの向きに追従させて、視界内に収める方法を紹介します。
![]()
- シーン内の追従させたいUIのゲームオブジェクトを選択します。
Floating Panel Controllerコンポーネントがアタッチされていない場合は、アタッチします。- 以下のプロパティを確認します。
- Follow Gaze:有効にすると左右方向で追従します。
- Lock Y Position: 無効にすると上下方向で追従します。(有効にすると、高さが固定されます。)
ヘッドロック表示の実装(推奨)

- ヘッドロック(Head-locked)
ユーザーが頭を左右に振ったり、上下に動かしても、常にユーザーの視界の相対位置に表示されること。 - ワールドロック(World-locked)
ユーザーが頭を動かしたり、部屋の中を歩き回ったりしても、コンテンツが現実世界のその場所に留まり続けること。
ここでは、ヘッドロックで表示するコンテンツの実装方法を紹介します。
ヘッドロックのコンテンツを推奨方法以外で実装している場合、空間上でのコンテンツが小刻みに震えることがあります。
ヘッドロックで表示するコンテンツの実装方法
ヘッドロックで表示したいコンテンツにFloating Panel Controllerコンポーネントをアタッチします。
Floating Panel Controllerは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/1.X.X/Core Samples/Shared Assets/Scripts/FloatingPanelController.cs
この例では、シーン内にあるMenuコンテンツにFloating Panel Controllerコンポーネントをアタッチします。

アタッチしたFloating Panel Controllerのパラメータを以下のように変更します。

| 変数名 | 値 |
|---|---|
| Follow Gaze | チェックを付ける |
| Lock Y Position | チェックを外す |
| Target Distance | 任意の値(ターゲットまでの距離を設定) |
| Movement Smoothness | 任意の値(デフォルト:0.2) |
| Vertical Bias | 0 |
| Horizontal Bias | 0 |
コンテンツを追随する速度の変更
ユーザーの頭の動作に対してヘッドロックのコンテンツの追随する速度が遅いと感じた場合、Movement Smoothnessの値を変更します。
Movement Smoothnessの値を0.3や0.4などに増やすと追随する速度が速くなります。値を1以上にすると空間上でのコンテンツが小刻みに震えるなどの動作になる場合があります。Movement Smoothnessのデフォルト値は0.2です。
コンテンツをロールに追従する方法
Floating Panel Controllerはロールに追従しません。常に天井が上となるため、横になったときに90度回転したり、逆さまになったときに180度回転します。
ロールに追従したい場合は以下の変更を行います。
public class FloatingPanelController : MonoBehaviour
{
...
private void AdjustPanelPosition()
{
...
// [変更前]
// var newRotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(newPosition - headPosition), MovementSmoothness);
// [変更後]
var newRotation = Quaternion.Lerp(transform.rotation, _arCameraTransform.rotation, MovementSmoothness);
...
}
}
Floating Panel Controllerの開始
Floating Panel Controllerは、StartメソッドでアクティブになっているXROriginのCameraを取得します。
そのため、Floating Panel ControllerをアタッチしたコンテンツはXROriginがアクティブになってから開始する必要があります。
例えば、Dual Render Fusionのシーンでは、シーンの開始時にXROriginが非アクティブのため、Floating Panel Controllerをアタッチしたコンテンツをアクティブの状態でシーン内に配置すると、Floating Panel ControllerがXROriginのCameraを取得できない可能性があります。
このような場合、Floating Panel Controllerをアタッチしたコンテンツは、XROriginがアクティブになってからFloating Panel Controllerをアクティブにします。
これに対応する方法の例を2つ紹介します。
-
例1. OpenXRが開始してからコンテンツをアクティブにする方法
OpenXRが開始した後にFloating Panel Controllerをアタッチしたコンテンツがアクティブになるように、SpacesLifecycleEventsのOnOpenXRStartedで、Floating Panel ControllerをアタッチしたコンテンツがアクティブになるようにSetActiveメソッドを呼び出します。
シーンの開始時には、Floating Panel Controllerをアタッチ したコンテンツが非アクティブになるように設定します。

-
例2. Floating Panel Controllerを変更する方法
Floating Panel ControllerのStartメソッドにあるOriginLocationUtility.GetOriginCamera関数の引数をtrueに設定します。
引数をtrueに設定すると、XROriginが非アクティブでもCameraを取得します。public class FloatingPanelController : MonoBehaviour
{
...
private void Start()
{
// [変更前]
// _arCamera = OriginLocationUtility.GetOriginCamera();
// [変更後] 引数にtrueを設定する
_arCamera = OriginLocationUtility.GetOriginCamera(true);
...
}
...
}