UnityでHololensアプリ制作(Unity2022LTS)

開発環境

HoloLens および Windows Mixed Reality (VR) ヘッドセット用のアプリ開発は、Microsoftの提供するMRTKを使用する。
正式リリースはMRTK2.8だが、MRTK3.0へは機能毎にシームレスに移行されるとのこと。
開発環境として、Windows 10 または 11 の最新バージョンのPC
Visual Studio 2019 Community 版かそれ以上(Visual Studio 2022推奨)とMR用追加モジュール
Windows10SDKが必要
  • .NET デスクトップ開発
  • C++ によるデスクトップ開発
  • ユニバーサル Windows プラットフォーム (UWP) の開発
  • Unity によるゲーム開発




  • VisualStudio側の設定は一度しておけばよい。

    HoloLensデバイスの開発者設定

    自分で開発したアプリをHoloLensにインストールできるようデバイスを開発者設定を有効にする。 開発用PCとホロレンズは、ペアリング済みにしておく。

    Unity2022LTSと追加モジュールのインストール

    URPを使用するHoloLensアプリで、Unity 2020よりUnity2021の方がパフォーマンス低下するバグが判明しており、 解決済みのUnity 2021.3.14f1 以降かUnity2022LTSを使用する。

    HoloLensアプリのビルドで、Universal Windows Platform Build SupportおよびWindows Build Support( IL2CCP)が必要になるので、UnityHubからモジュールをインストールする。


    Unityで、HoloLensの他にMeta QuestやiPad,AndroidなどでARアプリを一緒に開発する場合は、 Android Build Support, iOS Build Supportのモジュールもインストールしておく。

    各プラットフォーム用のBuild Supportモジュールがインストールされると、UnityHubで インストール済みUnityバージョンの表示の下にプラットフォームを示すアイコンが表示される。


    Unity Projectを新規作成して開始

    Unity2022LTSで、新規に3Dテンプレート(URP)でプロジェクトを開始する。
    Unity2021LTSの場合は、3.14 以降を使用する。

    プロジェクトが開始したら、メニューからBuildSettingで、開発ターゲットとなるplatformをUniversal Windows Platform(UWP)を選ぶ。
    ArchitectureをARM64-bitに変更する。
    (初期HoloLensはARM32bitだが、もう使わないと思うのでHoloLens2専用にする。)
    Build and Run Deviceをリモートに変更する。
    (Unityからデバイス接続しないので、HoloLensデバイスポータルの接続情報は記入せず空欄のままでよい。)

    SwitchPlatformを押す。

    警告が出ても、この段階では放置しておく。
    ここで一旦、Unityプロジェクトを終了する。
    続いて、プロジェクトにMRTKをインストールをする。

    MRTKのインストール

    MRTKのインストールは、Mixed Reality Feature Toolを使って行う。
    Mixed Reality Feature Toolで、モジュールを選んでUnityプロジェクトにMRTKをインストールできる。
    MRTK3からは、モジュール毎にバージョンアップがされるようになっており、現在のMRTK2.8からシームレスに移行する。

    Microsoft ダウンロード センターから、Mixed Reality Feature Toolをインストールする。
    Mixed Reality Feature Tool の最新バージョンをダウンロード

    ダウンロードが完了したら、ファイルを実行し、MRFTを起動する。

    Mixed Reality Feature Tool起動



    スタートして、MRTKを使うUnityプロジェクトのフォルダを指定する。

    プロジェクトに入っているMRTK要素がカテゴリ別に表示される。 追加したいMRTK要素を選択する。

  • Mixed Reality Toolkit Foundation
  • Mixed Reality OpenXR plugin
  • の2つを選択し、GetFeaturesを押してプロジェクトにインポートする。

    依存関係のある要素も一緒に選択されるのでインポートする。

    Unityプロジェクトのマニフェストファイルにパッケージ情報を記載するのを許可する。

    ExitでMixed Reality Feature Toolを終了する。

    これでプロジェクトにインポート設定が書き込まれたので、プロジェクト再開時にインストールされる。

    UnityHubからプロジェクトを開くと、読み込み途中でMRTKがインポートされる。
    Unity Input systemへの切替えのため一度再起動する。


    もし古いInputManagerも使いたい時は、Project SettingsのPlayer>Other Settings>Active Input Handlingで「Both」に設定しもう一度再起動すれば
    New Input Systemと旧Input Managerの両方が使用できる。


    MRTKがインポートされてプロジェクトが開いたら、 MRTKのダイアログでOpenXRPluginで使う(推奨)かBuild-in XR Pluginで使うか、選択する。

    OpenXRPluginを選ぶ。

    show XR Plugin managementを押すとSettingsが開く。

    OpenXRをチェック選択すると警告マークが出る。
    警告マークを押して、少なくとも一つのプロファイルが必要というのはEditを押しプロファイルを加える。

    OpenXR Featurs Grouosの、Microsoft HoloLensにチェックする。
    Interaction ProfilesがList is Empty となっているので、3回+を押して3つ加える。
  • Eye Gaze Interaction Profiles
  • Microsoft Motion Controller Profiles
  • Microsoft Hand Interaction Profiles


  • その他のエラーがある場合はFixを押すと消える。


    MRTK初回設定

    MRTKダイアログに戻って、Apply Settingを押す。
    何もなければ、Nextを押す。

    Applyを押す。

    Unity再起動の表示が出るのでApplyを押す。

    Unityが再起動しプロジェクトが開いたら、アプリ制作開始。

    ProjectSettingsでアプリ設定する

    File>Build Settings>Player Settingまたは、Edit>ProjectSettingsを開く。
    Playerの設定をする
    Comparny Nameは、アプリ制作者(会社)名
    Product Nameは、HoloLensのメニューに表示される名前になる。
    Publishing Settings項目の、Pacakge Nameは、Hololensにインストールされるアプリの識別名になる。
    (同じ名前にしているとアプリをインストールした時に上書きされるので、例えばProduct Nameに変えておく。)

    Publishing Settings項目の下の方に、アプリが使うHoloLensデバイス機能にチェックがあるか確認しておく。
    Capabilities
    また、Supported device FamiliesにHolographicをチェックする。


    Unityシーンの作成

    MRTKオブジェクト追加とMRTKのConfigration設定

    Unityエディターメニューに追加された、Mixed Reality Toolkitから、Add to scene and configureを押すと 編集中シーンにMRTK関連オブジェクトが自動追加される。


    Unityエディターのヒエラルキーで、自動追加されたオブジェクトの一つMixedRealityToolkitを選び Inspector ウィンドウで設定を行う。
    MixedRealityToolkitオブジェクトの、MixedRealityToolkitコンポーネントについて
    DefaultMixedRealityToolKitConfigrationProfileが選択されているのを、 DefaultHoloLens2ConfigrationProfileへ変更する。


    DefaultProfileのままでは、設定を自分なりに変更して保存することができないので、Copy And Customizeまたは Cloneを押して、編集可能な自分用Profileファイルを作る。
    名前がNew...では自分が作ったものか判らくなってしまうので、MyHololens...などの独自の名前にするのが良い。

    Cameraのページで、EnableCamecaSystemがONになっているか確認する。
    下の方にある設定はグレーアウトされて変更できないので、ここもプロファイルをクローンする。

    プロファイルをクローンして設定を書き換え可能になったら、
    DisplyaSettingのBackground Colorのカラーチャートを確認。
    OpaqueとTransparentの2種が用意されるようになった。
    1種しかない場合は、アルファ値を0(透明)にしておく。
    黒(アルファ255)のままでは、ビデオ撮影時にカメラスルー映像に黒背景が重なって暗くなるので、 透明にしておく。


    MRTKの、Spatial AwarenessのページでEnable Spatial Awareness Systemにチェックを入れると
    周囲を認識した空間メッシュが生成されて表示される。

    OpenXRのプロファイルをクローンして設定を書き換え可能にしたら、
    DisplayOptionをVisibleからOcclusionに変更すれば、メッシュは見えなくなるが、奥に置いたものを遮る陰になる。

    Diagnosticsのページで、Diagnostics SystemのチェックがONだとプログラム実行中にCPU稼働率バーグラフが視線下方に表示される。
    アプリ実行中に、音声認識で表示をOn/Offすることもできる。
    要らない場合は、チェックを外しておく。

    HoloLens デバイストラッキング設定

    ヒエラルキーのMixedRealityPlayspaceの下にあるMainCameraには、MRTKのカメラ設定がされており、 シーン内でこのMainCameraが向いている視点映像をHoloLensスクリーンに映す。

    しかし、HololLensデバイスの動きをトラッキングしてシーン内のMainCameraを同期して動かすための設定がされていない。
    MainCameraオブジェクトを選択し、Inspector ウィンドウでAdd Componentを押し、下記コンポーネントを追加する。
  • TrackedPoseDriverコンポーネント

  • このコンポーネントが追加されると、HoloLensヘッドセットの動きを取得してカメラが動くようになる。

    TrackedPoseDriver(Input System)コンポーネントを使う場合はAction設定が必要。

    3Dオブジェクトの配置

    MainCamera(0,0,0)のはZ方向(+)に向いているので、HoloLensで見たいオブジェクトをZ方向に配置すれば、 アプリ起動時の視線の正面に表示される。
    Cubeを使う場合、スケール1のままでは1辺が1mあり大きすぎるので、スケールを(0.3,0.3,0.3)にする。
    この大きさで1m先(0,0,1)に置けば、顔の前に手を伸ばしてギリギリ届かないくらいに白い箱が表示される。

    パソコンスクリーン上で動作確認

    シーンウィンドウからゲームウィンドウに切り替えると、MainCameraの映す真っ暗な背景に白い箱が見える。
    プレイボタンを押すとPCによるエミュレーションが始まるので、HoloLensの動きを確認できる。


    自分(デバイス)の移動は、W(前)A(左)S(後)D(右)Q(上)E(下)
    オブジェクトは空間の同じ位置に留まっているので、自分の移動と逆方向にスクリーン内で動けば正常動作。


    もう一度、プレイボタンを押して、シーン編集画面に戻る。
    シーンをセーブする。

    手で物を動かす設定

    動かしたいオブジェクトに、コンポーネントを追加する。
  • Object Maniplatorコンポーネント
    タッチポイントで操作できる。
    両手操作で移動、回転、スケールができるEverythingになっているが、Scaleはしないようにしておく方が現実らしく自然。

  • NearIntacractionGrabableコンポーネント
    Object Maniplatorコンポーネントも必要。
    掴んで動かす操作ができる。
  • プレイボタンを押すとPCによるエミュレーションが始まるので、HoloLensの動きを確認できる。

    右クリックドラッグが視線向きをエミュレートしており、マウスの動きで顔向き変更動作。
    手の動きは、Space (右手) または左 Shift (左手) を押して、マウス操作する。
    T , Yキーで手が表示されたまま固定される。
    手の回転の動きは、Ctrl を押しながらマウスを動かす


    もう一度、プレイボタンを押して、シーン編集画面に戻る。
    シーンをセーブする。

    ビルドしたアプリをHoloLensで動作確認

    File>Build Settingsで、Unity編集中のシーンをBuild対象に加える。
    アーキテクチャをARM64を確認。
    Build and Run Deviceをリモート
    HoloLensデバイスポータルの接続情報は空欄で可。



    Buildを押し、結果を保存するフォルダ(最初は新規作成)を選んでビルドする。

    ビルドが終わったら、フォルダが開く
    フォルダの中のソリューションファイル(拡張子sln)をダブルクリックしてVisualStudioを開く。

    初回は時間がかかる。左下隅のアニメーションをアイコンをクリックすると進行状況が表示される。
    準備が終わるとアニメーションが止まる。
    追加必要なモジュールがある場合は、指示に従ってVisualStudioのモジュールをインストールする。

    小さな下向き矢印で、デバックからリリースに変える。

    小さな下向き矢印で、ARMからARM64に変える。

    小さな下向き矢印で、リモートからデバイスに変える。(リモートはWiFi接続、デバイスはUSB接続)

    HoloLensをUSBでPCに接続。
    メニュー>デバックから、デバックなしで開始を押して、ビルドと配置を開始する、

    初回は、ペアリングが必要になる。
    ペアリングに必要なPINは、HoloLensのホームメニュー>設定>更新とセキュリティ>開発者向け>ペアリングにある。

    アプリがビルドされる。

    0 レイアウトの更新が始まったら、HoloLensを装着して待機。
    配置が成功したら、HoloLensデバイスでアプリの動作を確認する。

    HoloLensが起動中であればアプリが起動されるが、起動されなければメニューからアプリを選択し開始する。
    アプリ起動時のヘッドセットの位置が、UnityシーンのMRTKカメラ原点と同じ位置になり、 MRTKカメラとの相対位置を保ってオブジェクトが出現する。
    出現した後は、自分が動き回ってもオブジェクトは同じ位置に留まっているはず。


    Vuforiaの利用

    PTCのVuforiaを使うと、Vuforiaターゲットを位置参照にして特定場所にオブジェクトを出現させられる。
    VuforiaはWebカメラ映像で3D照合するので、HoloLensやiOSデバイスだけでなくPCでも空間認識機能を使用可。
    マーカー位置から自己位置を逆算してARオブジェクトの表示位置をコントロールできる。
    主なVuforiaターゲットの種類

    エリアターゲットは、Matterportカメラの3DスペースやLeicaBLK360などの3Dスキャナ点群を指定して作成するか、 iPad/iPhoneのLidarを使う専用アプリで3D撮影した情報でデータベースに登録して使用する。
    UnityでVuforiaを使うには、Vuforia開発者サイトにログインしてリリースされている最新のUnityパッケージをダウンロードする。

    Vuforia開発者の登録

    Vuforia開発者としてアカウントを登録する。
    登録

    Vuforia Engine(unity.package)のダウンロード

    Vuforia Engine v10.8 2022・6・29

    "add-vuforia-package-10-8-4.unitypackage"をダウンロードしたら、 Unityプロジェクトが開いた状態で、Assetフォルダにドラッグドロップすれば、プロジェクトにVuforia機能が追加される。

    古いバージョンを使用中の場合、アップデートされる。

    UnityエディタメニューのWindowの中にVuforia Configrationが出現する。

    Vuforiaのライセンス設定


    Window>Vuforia ConfigrationでインスペクターウィンドウにVuforia Configrationを表示する。
    開発者ライセンスへの合意は、help>Vuforia Engine>Show Developer Agreementにある.



    Vuforia開発者のサイトでライセンスを発行する。
    無料の開発者BASIC planで多くのVuforia 機能がほとんど制約なしに使用できるようになった。
    また、Model Targets と Area Targets も、各20個まで開発用途で利用できるようになった。

    Open License Articleを押すと、ライセンスに関する説明に飛ぶ。
    Add Licenseボタンを押すと、Vuforia開発者サイトのライセンス管理ページが開く。

    Vuforia開発者サイトにログインして、発行済みライセンスか新規発行を選ぶ。
    アプリで使用するライセンスをリストをクリックする。

    ライセンス情報のテキストをクリックすると、クリップボードにコピーされる。
    インスペクターウィンドウのライセンスキーのところへ、ライセンス情報のテキストをペーストして書き込む。

    アプリ使用中に同時に認識させるイメージターゲットの最大数を設定する。
    Max Simultaneous Tracked Imagesが、1だと1つを認識中に2つ目を見つけても無視する。


    Vuforia ARカメラ機能をMainCamreraに追加

    ヒエラルキーのMixedRealityPlayspaceの下にあるMainCameraを選択する。

    MainCameraオブジェクトのInspector ウィンドウで下記コンポーネントを追加する。
    Script>Vuforia Behaviourコンポーネント

    MainCamreraはすでにHoloLens情報投影用のカメラになっているが、 同時にVuforiaのARCamera(マーカーを読み取って3D位置を割り出す)機能が加わる。

    Vuforiaターゲット(ARマーカー)の追加

    GameObjectにある、VuforaEngineから、各種ターゲットをシーンへ追加する。
    Unityのシーン内で配置したターゲットの位置や向きは現実の位置とは関係なく、 アプリ実行時にカメラが見つけたターゲットの現実の位置が表示の基準になる。
    Vuforiaターゲット追加

    ターゲットには、見つけたときに何をさせるかコマンドをインスペクターで書き込むことができる。
    コマンドを指定しなくても、ヒエラルキーでターゲットの子供になるように、 オブジェクトを入れておけば、ターゲットをカメラで見つけたときに割り出した現実のターゲット位置を原点とした相対位置で オブジェクトが出現する。




    シーンができたら、テスト実行する。
    PCにWebカメラがあれば、プレイボタンを押してPC画面で再生したときに、Webカメラ映像にオーバーラップしてシーン内の3DオブジェクトがPCスクリーンに再生される。
    カメラでターゲットをとらえるとターゲットの子供に設定したオブジェクトが出現する。
    イメージターゲットのような小さなものであれば、PCのプレビューでもVuforia機能の作動テストができる。

    エリアターゲットのように大きなものは、HoloLensで実行して動作確認する。