オーバーレイと入力フォーカス
更新日時: 2024/07/31
フォーカス検知機能をサポートしていないアプリをMeta Horizonストアに提出すると、Metaは警告のフラグを立てます。開発プロセスの早い段階でフォーカス検知機能を有効にして、アプリが入力の消失を処理する方法をテストし、システムUIがオーバーレイとして表示されるようにすることをおすすめします。
このガイドでは、Meta QuestアプリのUnrealアプリで、オーバーレイとフォーカス検知機能を使う方法について説明します。
オーバーレイとは、ユニバーサルメニューなどのMeta Questシステムインターフェイスを、アプリを閉じることなくアプリに重ねて表示する機能です。ユーザーはこのようなオーバーレイからソーシャルメニューや設定などのシステム機能にアクセスできるので、エクスペリエンスが中断することはありません。オーバーレイを正しく表示するには、アプリがフォーカスを検知できる必要があります。
アプリが、入力フォーカスの消失やシステムオーバーレイの有無など、ステータスの変化をクエリするようにしてください。オーバーレイが表示されたら、アプリは適切なアクションを実行することができます。例えば、ユニバーサルメニューがアプリの上に重ねて表示された場合、アプリの実行は継続されますが、入力フォーカスが失われるのでゲームプレイは一時停止するかもしれません。
Meta XR Unreal統合では、以下がサポートされます。
- アプリを入力フォーカス検出可能にするかどうかを構成できる。
- 入力フォーカスを処理する。
どのMeta Questアプリも、ストアで承認されるにはフォーカス検知に対応していなければなりません。そのため、フォーカス検知はデフォルトでオンになっています。それによりユーザーは、アプリを中断することなく、オーバーレイ表示されるユニバーサルメニューやシステムアクションに確実にアクセスできます。
オーバーレイでアプリが円滑に動作するようにするには、次のガイドラインに従ってください。
- アプリエクスペリエンスの継続性: システムUIが表示されると、アプリは実行を継続します。ユーザーはオーバーレイを利用する場合でもシームレスな体験を期待しています。例えば、ユニバーサルメニューが表示されたときに梯子を登っていたプレイヤーは、梯子から落下するよりも、梯子をつかんだ状態を維持するでしょう。
- 進捗ロスを回避する: ユーザーは、アプリが進捗ロスを回避する方法でオーバーレイコンテンツを処理することを期待する可能性があります。ペースの速いシングルプレイヤーゲームの場合は、レベルの損失を防ぐためにゲームプレイを一時停止することを検討してください。マルチプレイヤーゲームでは、他のプレイヤーの体験を邪魔しないように、通常通り継続してください。メディアを使用するエクスペリエンスの場合も継続されるようにします。これは多くの場合に、ユニバーサルメニューをマルチタスクに対して起動し、2次タスクを処理している間も再生が継続されることを、ユーザーが期待するためです。
- 入力アフォーダンスと近接オブジェクトを非表示にする: オーバーレイUIは、システムにより、約2メートルのユーザーのパーソナルスペース内にレンダリングされます。両眼視差を回避するために、この距離よりも近い場所に表示されるアプリ内メニューなど、入力アフォーダンスやオブジェクトを非表示にしてください。
- オーディオの音量を調整する: ユーザーがアプリではなくシステムUIを操作していることを伝えるため、ゲームプレイ中のオーディオ再生の音量を抑えるかミュートにしてください。
- リモートユーザーにプレゼンスを示唆する: マルチユーザーエクスペリエンスを確保するため、あるユーザーがシステムUIを操作している場合に、周りのユーザーにそのことを通知してください。これにより、ほかのユーザーはそのユーザーがなぜ無反応に見えるのかを理解できます。
オーバーレイが表示されると(ユーザーが

ボタンを押したときなど)、実行中のアプリが入力フォーカスを失い、
HasInputFocusフラグが
falseを返すようになります。
入力フォーカスの状態は、Blueprintまたはコードを使ってクエリすることができます。このクエリは、フレームレンダリングサイクルごとに一度実行する必要があります。
Blueprintsを使って入力ステータスをクエリするには、OculusLibrary::HasInputFocusを使用します。
C++で入力フォーカスのステータスをクエリするには、次のようなコードを使用します。
ovrpBool HasFocus = ovrpBool_False;
if (OVRP_SUCCESS(ovrp_GetAppHasInputFocus(&HasFocus)))
{
return HasFocus == ovrpBool_True;
}
else
{
return false;
}
入力フォーカスが失われたときに、アプリが適切なアクションを実行するようにしてください。以下はその例です。
- ゲームプレイを一時停止する。その際に重要な点として、アプリのUIの上に重ねてシステムのUIが表示されるため、アプリは入力フォーカスを失い、入力を受け付けなくなることに注意してください。
- 腕や手などのユーザーの入力アフォーダンスを非表示にする
- オンラインゲームやマルチプレイヤーゲームの場合、ユーザーのフォーカスがアプリではなくシステムUIにあるなら、そのことを示す。
ユーザーがオーバーレイを閉じると、アプリが入力フォーカスを取り戻し、HasInputFocusフラグがtrueを返すようになります。この場合は、ゲームプレイを再開するか、またはユーザーの入力アフォーダンスを表示することができます。
以下は、入力フォーカスがVRCharacter Blueprintからシステムオーバーレイに切り替わった時点でトラッキング対象コントローラーを非表示にするという処理を実装するための一般的な方法を示しています。