メインコンテンツまでスキップ
バージョン: 1.0.2

UIの追従

UIをグラスの向きに追従

UIをグラスの向きに追従させて、視界内に収める方法を紹介します。

alt text

  1. シーン内の追従させたいUIのゲームオブジェクトを選択します。
  2. Floating Panel Controllerコンポーネントがアタッチされていない場合は、アタッチします。
  3. 以下のプロパティを確認します。
    • Follow Gaze有効にすると左右方向で追従します。
    • Lock Y Position無効にすると上下方向で追従します。(有効にすると、高さが固定されます。)

ヘッドロック表示の実装(推奨)

alt text

  • ヘッドロック(Head-locked)
    ユーザーが頭を左右に振ったり、上下に動かしても、常にユーザーの視界の相対位置に表示されること。
  • ワールドロック(World-locked)
    ユーザーが頭を動かしたり、部屋の中を歩き回ったりしても、コンテンツが現実世界のその場所に留まり続けること。

ここでは、ヘッドロックで表示するコンテンツの実装方法を紹介します。

WARNING

ヘッドロックのコンテンツを推奨方法以外で実装している場合、空間上でのコンテンツが小刻みに震えることがあります。

ヘッドロックで表示するコンテンツの実装方法

ヘッドロックで表示したいコンテンツにFloating Panel Controllerコンポーネントをアタッチします。
Floating Panel Controllerは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/1.X.X/Core Samples/Shared Assets/Scripts/FloatingPanelController.cs

この例では、シーン内にあるMenuコンテンツにFloating Panel Controllerコンポーネントをアタッチします。 alt text

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

変数名
Follow Gazeチェックを付ける
Lock Y Positionチェックを外す
Target Distance任意の値(ターゲットまでの距離を設定)
Movement Smoothness任意の値(デフォルト:0.2)
Vertical Bias0
Horizontal Bias0

コンテンツを追随する速度の変更

ユーザーの頭の動作に対してヘッドロックのコンテンツの追随する速度が遅いと感じた場合、Movement Smoothnessの値を変更します。

Movement Smoothnessの値を0.30.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メソッドでアクティブになっているXROriginCameraを取得します。
そのため、Floating Panel ControllerをアタッチしたコンテンツはXROriginがアクティブになってから開始する必要があります。

例えば、Dual Render Fusionのシーンでは、シーンの開始時にXROriginが非アクティブのため、Floating Panel Controllerをアタッチしたコンテンツをアクティブの状態でシーン内に配置すると、Floating Panel ControllerXROriginCameraを取得できない可能性があります。 このような場合、Floating Panel Controllerをアタッチしたコンテンツは、XROriginがアクティブになってからFloating Panel Controllerをアクティブにします。
これに対応する方法の例を2つ紹介します。

  • 例1. OpenXRが開始してからコンテンツをアクティブにする方法
    OpenXRが開始した後にFloating Panel Controllerをアタッチしたコンテンツがアクティブになるように、SpacesLifecycleEventsOnOpenXRStartedで、Floating Panel ControllerをアタッチしたコンテンツがアクティブになるようにSetActiveメソッドを呼び出します。
    シーンの開始時には、Floating Panel Controllerをアタッチしたコンテンツが非アクティブになるように設定します。
    alt text

  • 例2. Floating Panel Controllerを変更する方法
    Floating Panel ControllerStartメソッドにあるOriginLocationUtility.GetOriginCamera関数の引数をtrueに設定します。
    引数をtrueに設定すると、XROriginが非アクティブでもCameraを取得します。

        public class FloatingPanelController : MonoBehaviour
    {
    ...

    private void Start()
    {
    // [変更前]
    // _arCamera = OriginLocationUtility.GetOriginCamera();
    // [変更後] 引数にtrueを設定する
    _arCamera = OriginLocationUtility.GetOriginCamera(true);
    ...
    }
    ...
    }