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);
...
}
...
}