HoloLens (第 1 世代) アプリを HoloLens 2 に移植する
このガイドは、HoloLens (第 1 世代) 用の既存の Unity アプリケーションを持っている開発者が、アプリケーションを HoloLens 2 デバイスに移植する場合に役立ちます。 HoloLens (第 1 世代) の Unity アプリケーションを HoloLens 2 に移植する主な手順は 4 つあります。
次のセクションで、各ステージについて詳しく説明します。
ステップ 1 | ステップ 2 | ステップ 3 | ステップ 4 |
---|---|---|---|
最新のツールのダウンロード | Unity プロジェクトの更新 | ARM 用にコンパイル | MRTK v2 に移行 |
前提条件
移植プロセスを開始する前に、ソース管理を使用してアプリケーションの元の状態のスナップショットを保存しておくことを強くお勧めします。 また、プロセス中に、さまざまなタイミングでチェックポイントの状態を保存することをお勧めします。 元のアプリケーションの別のインスタンスを Unity で開いておくと、移植プロセス中に並べて比較できるので便利だと思われるかも知れません。
Note
移植の前に、Windows Mixed Reality 開発のために最新のツールがインストールされていることを確認します。 ほとんどの既存 HoloLens 開発者は、最新バージョンの Visual Studio 2019 への更新と適切な Windows SDK のインストールを行うことになります。 以下の内容では、Unity のさまざまなバージョンと Mixed Reality Toolkit (MRTK) バージョン 2 についてさらに詳しく説明します。
詳しくは、「ツールのインストール」を参照してください。
プロジェクトを最新バージョンの Unity に移行する
MRTK v2 を使用している場合は、MRTK 2.7 に更新してから、プロジェクトを Unity 2020.3 LTS にアップグレードすることをお勧めします。 MRTK 2.7 では Unity 2018、2019、2020 がサポートされているので、Unity をアップグレードする前でもプロジェクトを Unity 2020 に備えることができます。 現在プロジェクトに存在するすべてのプラグインの依存関係を評価し、これらの DLL を ARM64 用にビルドできるかどうかを判断します。 ハード ARM に依存するプラグインがあるプロジェクトでは、ARM 用のアプリのビルドを続ける必要がある場合があります。
Unity でシーンまたはプロジェクト設定を更新する
デバイスで最適な結果を得るためには、Unity 2020.3 LTS に更新した後で、Unity の特定の設定を更新することをお勧めします。 これらの設定の詳細については、「Unity で推奨される設定」を参照してください。
繰り返しますが、.NET スクリプト バックエンドは Unity 2018 で非推奨となり、Unity 2019 で削除されました。 プロジェクトの IL2CPP への切り替えを検討することを強くお勧めします。
Note
IL2CPP スクリプト バックエンドのために、Unity から Visual Studio へのビルド時間が長くなる場合があります。 開発者は、IL2CPP のビルド時間を最適化するために開発者マシンを設定する必要があります。 また、大きなアセット (スクリプト ファイルを除く) があったり、シーンやアセットを常に変更したりする Unity プロジェクトの場合は、キャッシュ サーバーを設定すると役立つ場合もあります。 プロジェクトを開く際に、Unity は条件を満たすアセットを内部キャッシュ フォーマットで開発者のコンピューターに格納します。 項目を変更した場合は、再インポートして再処理されるようにする必要があります。 このプロセスが 1 回実行されてキャッシュ サーバーに保存されると、他の開発者と共有されます。すべての開発者がローカルで新しい変更の再インポート処理を行う必要がなくなり、時間の節約になります。
更新された Unity バージョンへの移行によって生じた破壊的変更に対処したら、HoloLens (第 1 世代) 上で現在のアプリケーションをビルドしてテストします。 この時点でソース管理にコミットを作成し、保存しておくとよいでしょう。
ARM プロセッサ用の依存関係およびプラグインのコンパイル
HoloLens (第 1 世代) では x86 プロセッサでアプリケーションを実行しますが、HoloLens 2 では ARM プロセッサが使われます。 既存の HoloLens アプリケーションは、ARM をサポートするように移植する必要があります。 前述のように、Unity 2018 LTS は ARM32 アプリのコンパイルをサポートしますが、Unity 2019.x 以降は ARM32 アプリと ARM64 アプリのコンパイルをサポートします。 パフォーマンスに重要な差があるため、ARM64 アプリケーションに向けた開発をお勧めします。 ただし、そのためには、すべてのプラグインの依存関係も ARM64 でビルドする必要があります。
アプリケーション内のすべての DLL 依存関係を確認してください。 プロジェクトで不要になった依存関係は削除することをお勧めします。 必要な残りのプラグインについて、Unity プロジェクトにそれぞれ ARM32 または ARM64 バイナリを取り込みます。
関連する DLL を取り込んだら、Unity から Visual Studio ソリューションをビルドし、Visual Studio で AppX を ARM 向けにコンパイルして、アプリケーションを ARM プロセッサ向けにビルドできることを検証します。 ソース管理ソリューションでは、アプリケーションをコミットとして保存することをお勧めします。
重要
MRTK v1 を使用するアプリケーションは、ビルド ターゲットを ARM に変更すると、HoloLens 2 で実行できます。ただし、他のすべての要件が満たされていることが前提です。 これには、すべてのプラグインの ARM バージョンがあることを確認することが含まれます。 ただしアプリは、多関節ハンドや視線追跡などの HoloLens 2 固有の機能にはアクセスできません。 MRTK v1 と MRTK v2 とでは名前空間が異なるため、両方のバージョンを同一のプロジェクトに含めることができます。これは、一方からもう一方に移行するのに役立ちます。
MRTK バージョン 2 に更新する
MRTK バージョン 2 は、Unity をベースにした新しいツールキットで、HoloLens (第 1 世代) と HoloLens 2 の両方をサポートします。 ここには、手による操作や視線追跡など、HoloLens 2 のすべての新機能も追加されています。
MRTK バージョン 2 の使用方法の詳細については、以下のリソースを参照してください。
移行を準備する
新しい MRTK v2 用の *.unitypackage ファイルを取り込む前に、(1) MRTK v1 を組み込んだ任意のカスタム ビルド コードと、(2) 入力操作や UX コンポーネント用のカスタム ビルド コードのインベントリを取得することをお勧めします。 Mixed Reality 開発者が MRTK v2 を取り込む際に最も競合が起きやすいのは、入力と操作に関係する部分です。 MRTK v2 入力モデルを確認することをお勧めします。
最後に、新しい MRTK v2 は、スクリプトのモデルおよびシーン内マネージャー オブジェクトから、構成およびサービス プロバイダー アーキテクチャに移行されています。 これにより、シーンの階層とアーキテクチャのモデルがクリーンになりますが、新しい構成プロファイルを習得する必要があります。 アプリケーションのニーズに合わせて調整する必要がある重要な設定やプロファイルについて熟知することの開始点として、Mixed Reality ツールキット構成ガイドを参照してください。
プロジェクトの移行
MRTK v2 をインポートすると、高い確率で、Unity プロジェクトでたくさんのコンパイラ関連エラーが発生します。 新しい名前空間の構造やコンポーネント名があるため、これらは一般的です。 スクリプトの名前空間とコンポーネントを新しいものに変更して、これらのエラーの解決を続けてください。
HTK/MRTK と MRTK v2 の具体的な API の相違点については、MRTK バージョン 2 wiki の移植ガイドをご覧ください。
ベスト プラクティス
- MRTK 標準シェーダーを優先させる。
- 破壊的変更についての作業は、一度に 1 種類とする (例: IFocusable から IMixedRealityFocusHandler)。
- 変更のたびにテストし、ソース管理を使用する。
- 可能な場合は既定の MRTK UX (ボタン、スレートなど) を使用する。
- MRTK ファイルを直接変更するのは避け、MRTK コンポーネントのラッパーを作成する。
- この操作をすると、将来の MRTK インジェストや更新が容易になります。
- MRTK で提供されているサンプルのシーンを確認する (特に HandInteractionExamples.scene)。
- キャンバス ベースの UI を四角形、コライダー、TextMeshPro テキストで再構築する。
- 深度バッファーの共有を有効にするか、フォーカス ポイントを設定する。パフォーマンスを向上させるには、16 ビットの深度バッファーを使用します。 色をレンダリングするときには、深度もレンダリングするようにします。 Unity では、一般的に、透明およびテキストのゲームオブジェクトの深度は書き込まれません。
- 単一パス インスタンス化レンダリングを選択します。
- MRTK 用の HoloLens 2 構成プロファイルを使用する
アプリケーションのテスト
MRTK バージョン 2 では、手による操作を直接 Unity でシミュレートすること、および手による操作と視線追跡用の新しい API を使用して開発を行うことができます。 十分なユーザー エクスペリエンスを作成するには、HoloLens 2 デバイスが必要です。 詳しく理解するには、ドキュメントとツールを調べることをお勧めします。 MRTK v2 では、HoloLens (第 1 世代) での開発がサポートされています。このため、"エアタップによる選択" などの従来の入力モデルを HoloLens (第 1 世代) でテストできます。
HoloLens 2 向けの操作モデルの更新
注意事項
プロジェクトでいずれかの XR.WSA API を使用している場合、今後の Unity のリリースでは Unity の新しい XR 入力 API が優先されるため、それらは段階的に廃止されていることに注意してください。 XR 入力 API の詳細についてはこちらを参照してください。
アプリケーションを移植して HoloLens 2 に対応するよう準備できたら、操作モデルやホログラムの設計配置の更新を検討できるようになります。 HoloLens (第 1 世代) では、アプリケーションで視線入力とコミットによる操作モデルが使われており、視野に収まるようにホログラムがかなり遠くにある可能性が高くなります。
アプリケーションの設計を HoloLens 2 に最適なように更新する手順は次のとおりです。
- MRTK コンポーネント: 事前作業ごとに、MRTK v2 を追加 した場合、HoloLens 2 用に設計および最適化されたさまざまなコンポーネント/スクリプトを活用できます。
- 相互作用モデル: 対話モデルを更新することを検討してください。 ほとんどのシナリオでは、視線入力から手に切り替えることをお勧めします。 一部のホログラムは手の届かないところにある場合があり、手に切り替えることで、ポインティング レイやグラブ ジェスチャによる、離れた対話式操作を利用することになります。
- ホログラムの配置: 手による対話式操作モデルに切り替えた後は、ユーザーが手で近接した対話式操作のグラブ ジェスチャを使用して直接それらを操作できるように、ホログラムを近くに動かすことを検討します。 直接つかんだり対話式操作を行ったりするために近くへ移動するホログラムの種類は、次のとおりです。
- 小さなターゲット メニュー
- controls
- buttons
- つかんで調べるときに、HoloLens 2 の視野内に収まる小さなホログラム。
アプリケーションやシナリオはさまざまです。Microsoft では、フィードバックや継続する学習に基づいて、設計ガイダンスの見直しと投稿を続けてゆきます。
X86 から ARM へのアプリケーションの移行に関するその他のヒント
複雑でない Unity アプリケーションであれば、ARM アプリケーション バンドルを構築したり、バンドルを実行するためにデバイスに直接デプロイしたりできるため、単純です。 一部の Unity ネイティブ プラグインでは、特定の開発上の課題が発生する可能性があります。 このため、すべての Unity ネイティブ プラグインを Visual Studio 2019 にアップグレードし、その後、ARM 用に再構築する必要があります。
1 つのアプリケーションが Unity AudioKinetic Wwise プラグインを使用していました。 使用されている Unity バージョンには、UWP ARM プラグインが用意されていませんでした。ARM で実行するため、問題のアプリケーションにサウンド機能を再作成するための多くの労力が必要でした。 開発プランに必要なすべてのプラグインがインストールされていて、Unity で利用できることを確認してください。
場合によっては、アプリケーションが必要とするプラグインに UWP/ARM プラグインが存在しない場合があります。これにより、アプリケーションを移植して HoloLens 2 で実行する機能がブロックされます。 問題を解決して ARM のサポートを提供するには、プラグインのプロバイダーにお問い合わせください。
シェーダーの minfloat (および min16float、minint などのバリアント) の動作は、HoloLens 2 と HoloLens (第 1 世代) で異なる場合があります。 具体的には、「少なくとも指定された数のビットが使われる」ことが保証されます。 Intel または NVIDIA の GPU では、minfloat は主に 32 ビットとして扱われます。 ARM では、指定されたビット数が実際に使用されます。 実際には、HoloLens 2 でのこれらの数値の精度や範囲は、HoloLens (第 1 世代) よりも小さくなります。
ARM では _asm 命令は動作しないと見られるので、_asm 命令を使用しているコードはすべて書き直す必要があります。
ARM では xmmintrin.h、emmintrin.h、tmmintrin.h、immintrin.h などの各種ヘッダーを使用できないため、ARM では SIMD 命令セットはサポートされません。
ARM のシェーダー コンパイラは、シェーダーの読み込み時ではなく、シェーダーが読み込まれた後またはシェーダーが依存するものが変更された後の最初の描画呼び出しの中で実行されます。 コンパイルする必要があるシェーダーの数によっては、フレームレートへの影響が目立つ場合があります。これは、HoloLens 2 と HoloLens (第 1 世代) でシェーダーの処理、パッケージ化、更新の方法をどう変える必要があるかに影響を及ぼします。