Unity で推奨される設定
Unity には、すべてのプラットフォームでおおむね平均的ケースとなる既定のオプション一式が用意されています。 ただし、Mixed Reality に固有の動作もいくつか Unity には備わっていて、それらはプロジェクトの設定を通じて切り替えることができます。
パフォーマンスに優れた環境のセットアップ
描画品質の設定を下げる
Unity の品質設定を非常に低い値に変更して、アプリケーションが適切なフレームレート (特に HoloLens 開発の場合) で適切に実行されるようにすることが重要です。 イマーシブ ヘッドセットにおける開発の場合、VR エクスペリエンスに寄与するデスクトップの仕様によっては、描画品質パラメーターを一番下まで落とさなくてもフレームレートは確保できます。
Unity 2019 LTS 以上では、[編集]>[プロジェクトの設定]>[品質] に移動し、下矢印をクリックして [既定] を **[きわめて低品質] レベルに設定することで、プロジェクトの品質レベルを設定できます。
照明設定
シーンの描画品質設定と同様、Mixed Reality アプリケーションでは、最適な照明設定を選択することが大切です。 Unity では、シーンに対するパフォーマンスの影響が最も大きい照明設定は、通常、[リアルタイム グローバル イルミネーション] です。 [ウィンドウ]>[レンダリング]>[照明の設定]>[リアルタイム グローバル イルミネーション] に移動することで、Global Illumination をオフにできます。
また、[ベイクド グローバル イルミネーション] という照明設定も存在します。 この設定は、イマーシブ ヘッドセットでは、パフォーマンスが向上し、視覚的にも魅力的な結果が得られますが、HoloLens 開発には適していません。 [ベイクド グローバル イルミネーション] が計算されるのは、静的な GameObject のみです。HoloLens のシーンは、未知の変化する環境という性質上、静的な GameObject は見られません。
詳細については、Unity のグローバル イルミネーションに関するページを参照してください。
Note
[リアルタイム グローバル イルミネーション] の設定はシーン単位です。開発者は、そのプロジェクト内の Unity シーンごとにこのプロパティを保存する必要があります。
シングル パス インスタンス レンダリング パス
Mixed Reality アプリケーションでは、シーンは目ごとに 1 回、2 回レンダリングされます。 従来の 3D 開発に比べると、計算すべき作業量が実質的に 2 倍となります。 UNITY で最も効率的なレンダリング パスを選択して、CPU と GPU の両方の時間を節約することが重要です。 シングル パス インスタンスレンダリングは、Mixed Reality アプリの Unity レンダリング パイプラインを最適化します。既定では、すべてのプロジェクトでこの設定を有効にすることをお勧めします。
Unity プロジェクトでこの機能を有効にするには
- OpenXR 設定を開きます ([編集]>[プロジェクト設定]>[XR プラグイン管理]>[OpenXR])。
- [レンダリング モード] ドロップダウン メニューから [単一パス インスタンス化] を選択します。
このレンダリング方法の詳細については、Unity の次の記事をお読みください。
Note
単一パス インスタンス化レンダリングに関する一般的な問題の 1 つは、開発者がインスタンス化対応に作成されていない既存のカスタム シェーダーを持っている場合に発生します。 この機能を有効にした後、開発者は、一部の GameObject が 1 つの視線でしかレンダリングしないことに気付く場合があります。 これは、関連付けられたカスタム シェーダーに、インスタンス化のための適切なプロパティがないためです。
深度バッファーの共有を有効にする
ユーザーの体感上のホログラムの安定性を高めるために、Unity の [深度バッファーの共有] プロパティを有効にすることをお勧めします。 これを有効にすると、Unity は、アプリケーションによって生成された深度マップを Windows Mixed Reality プラットフォームと共有するようになります。 アプリケーションによってレンダリングされるあらゆるフレームで、実際のシーンに合わせて、プラットフォームがより適切にホログラムの安定性を最適化できるようになります。
Unity プロジェクトでこの機能を有効にするには
- OpenXR 設定を開きます ([編集]>[プロジェクト設定]>[XR プラグイン管理]>[OpenXR])。
- 深度送信モードドロップダウン メニューから深度 16 ビットを選択します。
HoloLens 開発では、16 ビット深度バッファー設定が特に推奨されます。 24 ビットと比べて 16 ビットを選択した方が移動、処理すべきデータが少なくて済むので、帯域幅要件が大幅に下がります。 しかし、最適化には特定のコストが伴います。 以下の [重要] ボックスにメンション影響を理解していることを確認します。
Windows Mixed Reality プラットフォームでホログラムの安定性を最適化するには、深度バッファーを使用して正確にし、画面上のレンダリングされたホログラムと一致させます。 したがって、深度バッファー共有がオンになっている場合、深度もレンダリングするために色をレンダリングする際に重要です。 Unity では、ほとんどの不透明マテリアルまたは TransparentCutout マテリアルは既定で深度をレンダリングしますが、透明オブジェクトとテキスト オブジェクトは深度をレンダリングしませんが、これはシェーダーやその他の要因に依存します。
Mixed Reality Toolkit Standard Shader を使用している場合、透明なオブジェクトの深度をレンダリングするには、次の手順に従います。
- MRTK Standard シェーダーが使用されている透明な素材を選択し、[インスペクター] エディター ウィンドウを開きます。
- 深度バッファーの共有の警告内に表示されている [今すぐ修正] ボタンを選択します。 これは手動で行うこともできます。[レンダリング モード] を [カスタム] に設定した後、[モード] を [透明] に設定し、最後に [深度の書き込み] を [オン] に設定してください。
重要
開発者の方は、これらの値をカメラのニア クリップ面とファー クリップ面の設定と共に変更するとき、Z ファイティングに注意してください。 Z ファイティングは、2 つの GameObject が同じピクセルに対してレンダリングしようとしたときに、深度バッファーの忠実さの制限 (Z 深度)、つまりどちらのオブジェクトが手前にあるのかを Unity が認識できないことが原因で発生します。 Z 深度の値が同じ 2 つのゲーム オブジェクトが "競合" 状態となり、両者の間でちらつきが発生します。 これは、深度形式を 24 ビットに切り替えることで解決できます。カメラの Z 深度に関して各オブジェクトが計算する値の範囲が広がるためです。
しかし HoloLens 開発に限っては、カメラのニア クリップ面とファー クリップ面をより小さい範囲に変更し、16 ビット深度形式を維持することをお勧めします。 Z 深度は、ニア クリップ面とファー クリップ面に沿った値の範囲に対し、非線形的にマッピングされます。 これを変更するには、シーン内のメイン カメラを選択し、[インスペクター] で Near & Far Clipping Plane の値を変更して範囲を小さくできます (つまり、1000 m から 100m またはその他の x 値など)。
重要
16 ビット深度形式が使用されているときは、Unity でステンシル バッファーは作成されません。 そのため、Unity の UI 効果など、ステンシルを必要とする効果の中には、8 ビットのステンシル バッファーが作成される 24 ビット深度形式を選択しない限り、正しく機能しないものがあります。
IL2CPP のビルド
Unity で、.NET スクリプト バックエンドのサポートは非推奨になりました。そのため、開発者の方は、UWP Visual Studio ビルドに IL2CPP を利用することをお勧めします。 これにはさまざまな利点がありますが、Unity の IL2CPP 向け Visual Studio ソリューションは、従来の .NET 方式よりもビルドに時間がかかります。 開発のイテレーション時間を短縮するためにも、IL2CPP のビルドに関する以下のベスト プラクティスに従うことをお勧めします。
- 毎回同じディレクトリにプロジェクトをビルドすることで、インクリメンタル ビルドを活用し、ビルド済みのファイルを再利用します。
- プロジェクトとビルド フォルダーのマルウェア対策ソフトウェア スキャンを無効にする
- Windows 10 設定アプリでウイルスと脅威の防止を開く
- [ウイルスと脅威の防止の設定] の下の [設定の管理] を選択します
- [除外] セクションで、[除外の追加または削除] を選択します。
- [除外の追加] を選択し、Unity プロジェクト コードとビルド出力を含むフォルダーを選択します。
- SSD を使用してビルドする
詳細については、IL2CPP のビルド時間の最適化に関するページを参照してください。
Note
特に、大きなアセット (スクリプト ファイルを除く) がある場合や、常にシーンやアセットを変更する Unity プロジェクトの場合は、キャッシュ サーバーをセットアップするとよいでしょう。 プロジェクトを開く際に、Unity は条件を満たすアセットを内部キャッシュ フォーマットで開発者のコンピューターに格納します。 項目を変更した場合は、再インポートして再処理されるようにする必要があります。 このプロセスが 1 回実行されると、キャッシュ サーバーに保存され、すべての開発者に共有されます。すべての開発者がローカルで新しい変更の再インポート処理を行う必要がなくなるので、時間を節約できます。
公開のプロパティ
ホログラフィック スプラッシュ スクリーン
HoloLens に搭載されている CPU と GPU はモバイル クラスであるため、アプリの読み込みにやや時間がかかる場合があります。 アプリが読み込み中であっても、真っ黒なスクリーンが表示されるだけでは、何が起きているのかわからずユーザーが不安になってしまいます。 読み込み中にユーザーを安心させるために、ホログラフィック スプラッシュ スクリーンを追加できます。
ホログラフィック スプラッシュ スクリーンを切り替えるには:
- [編集]>[プロジェクトの設定]>[プレーヤー] ページに移動します。
- [Windows ストア] タブを選択し、[スプラッシュ画像] セクションを開きます。
- [Windows ホログラフィック] > [ホログラフィック スプラッシュ画像] プロパティで目的の画像を適用します。
- [Unity スプラッシュ スクリーンを表示する] オプションを切り替えることで、Unity ブランドのスプラッシュ スクリーンが有効または無効になります。 Unity Pro ライセンスをお持ちでない場合は常に、Unity ブランドのスプラッシュ スクリーンが表示されます。
- [ホログラフィック スプラッシュ画像] が適用されている場合、[Unity スプラッシュ スクリーンを表示する] チェック ボックスが有効であるか無効であるかにかかわらず常に表示されます。 カスタム ホログラフィック スプラッシュ画像を指定できるのは、Unity Pro ライセンスをお持ちの開発者のみです。
Unity スプラッシュ スクリーンを表示する | ホログラフィック スプラッシュ画像 | Behavior |
---|---|---|
オン | なし | 既定の Unity スプラッシュ スクリーンを 5 秒間またはアプリの読み込みが完了するまで表示します。どちらか長い方が適用されます。 |
オン | Custom | カスタムのスプラッシュ スクリーンを 5 秒間またはアプリの読み込みが完了するまで表示します。どちらか長い方が適用されます。 |
"オフ" | なし | アプリの読み込みが完了するまで、透明の黒い画面を表示します (つまり、何も表示されません)。 |
"オフ" | Custom | カスタムのスプラッシュ スクリーンを 5 秒間またはアプリの読み込みが完了するまで表示します。どちらか長い方が適用されます。 |
詳細については、Unity のスプラッシュ スクリーンに関するドキュメントを参照してください。
追跡の損失
Mixed Reality ヘッドセットは周囲の環境が見えることを前提に、ホログラムを適切な位置に固定できるワールドロックされた座標系を構築します。 ヘッドセットが周囲の空間の中で自分自身を見失ってしまうことを、ヘッドセットの "トラッキング喪失" といいます。 このような場合、ワールドロックされた座標系に依存する機能、たとえば空間ステージ、空間アンカー、空間マッピングは正しく機能しません。
トラッキング喪失が発生した場合は、ホログラムのレンダリングを停止し、ゲーム ループを一時停止すると共に、ユーザーの視線を快適に追従する通知でトラッキング喪失を知らせる、というのが Unity の既定の動作になります。 トラッキング喪失画像の形式でカスタム通知を指定することもできます。 エクスペリエンス全体にトラッキングを利用するアプリの場合、トラッキングが回復するまで、この処理をすべて Unity に委ねてもかまいません。 開発者は、トラッキング喪失時に表示されるカスタム画像を指定できます。
トラッキング喪失の画像をカスタマイズするには:
- [編集]>[プロジェクトの設定]>[プレーヤー] ページに移動します。
- [Windows ストア] タブを選択し、[スプラッシュ画像] セクションを開きます。
- [Windows ホログラフィック] > [トラッキング喪失画像] プロパティで目的の画像を適用します。
自動一時停止のオプトアウト
中には、トラッキングを必要としないアプリ (例: 360°動画ビューアーなどの向き限定のアプリ) や、トラッキングが失われている間も中断せずに処理を続行しなければならないアプリもあります。 トラッキング喪失時の既定の動作はオプトアウトできます。ただし、オブジェクトを非表示にしたり無効にしたりする設定は開発者が行う必要があります。トラッキング喪失の状況では、オブジェクトが適切にレンダリングされません。 通常、このケースでレンダリングすることが推奨されるコンテンツは、メイン カメラを中心とするボディロックされたコンテンツだけです。
自動一時停止の動作をオプトアウトするには:
- [編集]>[プロジェクトの設定]>[プレーヤー] ページに移動します。
- [Windows ストア] タブを選択し、[スプラッシュ画像] セクションを開きます。
- [Windows ホログラフィック] > [トラッキング喪失時の一時停止と画像の表示] チェック ボックスを変更します。
トラッキング喪失イベント
トラッキング喪失が発生したときのカスタムの動作を定義するには、グローバルのトラッキング喪失イベントを処理します。
機能
アプリで特定の機能を活用するには、そのマニフェストの中で適切な機能を宣言する必要があります。 マニフェストの宣言は Unity で行うことができます。そうすれば、将来のすべてのプロジェクト エクスポートにそれらが追加されます。
Mixed Reality アプリケーションで使用する機能を有効にするには:
- [編集]>[プロジェクトの設定]>[プレーヤー] ページに移動します。
- [Windows ストア] タブを選択し、[公開設定] セクションを開いて、[機能] リストを探します。
Holographic アプリで一般的に使用される API を有効にするための適用可能な機能は次のとおりです。
機能 | 機能を必要とする API |
---|---|
SpatialPerception | SurfaceObserver |
WebCam | PhotoCapture と VideoCapture |
PicturesLibrary または VideosLibrary | それぞれ PhotoCapture または VideoCapture (キャプチャされたコンテンツを格納する場合) |
マイク | VideoCapture (オーディオをキャプチャする場合)、DictationRecognizer、GrammarRecognizer、KeywordRecognizer |
InternetClient | DictationRecognizer (および Unity Profiler を使用する場合) |