つくるの大好き。

つくるのが大好きな人の記録。

HoloLens用 Managed Pluginの作り方

ご無沙汰しております。ご無沙汰の間に家族がひとり増えちゃいました☆

 

さて、HoloLensアプリのUnityプロジェクトにおいて、一部のソースコードを非公開にしたいと思い、ManagedのPluginを作ろうとしたのですが思いのほかハマってしまったので作り方をご紹介します。

サンプルプロジェクト

PluginをビルドするためのVisual StudioソリューションとHoloLens用Unityプロジェクトを含むシンプルなサンプルプロジェクトを公開しています。
こちらを参考にコードを追加するなどしてご活用下さい。

github.com

Pluginソリューション構成

f:id:peugeot-106-s16:20170404222955p:plain

Pluginをビルドするためにソリューションには4つのプロジェクトを用意しました。

  1. Shared
    ソースコードを保持する共有プロジェクト。
  2. Package4UnityEditor
    UnityEditorでの実行時に利用される.NET3.5をランタイムとするDLLのプロジェクト。ソースは実体を含めず1のものをリンクしている。

    f:id:peugeot-106-s16:20170404223714p:plain

  3. Package4UWP
    HoloLens実機(UWP)での実行時に利用されるUWP用DLLのプロジェクト。ソースは実体を含めず1のものをリンクしている。

    f:id:peugeot-106-s16:20170404223828p:plain

  4. UWPUnitTest
    3の動作確認のためのUnitTestプロジェクト。

UnityでHoloLensアプリを開発をする場合、UnityEditorでの実行環境とHoloLens実機での実行環境が大きく異なるためプラグインもそれぞれの環境で用いるものが必要です。

またハマリどころとしては、UnityEditor用PluginとUWP用Pluginは同じインターフェイスを持っていないとWindowsStore形式にビルドする際にエラーとなります。
また、これに関連しては後述するPlaceholderの設定が重要です。

共有ソース

#if NETFX_CORE を利用して実行環境に応じたコードがビルドされるようにします。
(これ可読性が悪いのでどうにかならないですかねw)

f:id:peugeot-106-s16:20170404225303p:plain

単純に”Hello”という文字を返すメソッドを用意しました。
UWP用コードでは無意味ですがサンプルとしてUnityEditorでは利用できないasync/awaitを使っていますw

このソースをPackage4UnityEditor, Package4UWPでビルドすることでそれぞれの環境用に同一のインターフェイスを持ったDLLをビルドすることができます。

動作テスト

プラグインの動作テストはHoloLens実機で行うとUnityからビルド、実機デプロイ、、と時間のかかる手順を何度も行うはめになりますし、デバッグ効率も悪くなります。
基本的な動作についてはUWP用UnitTestプロジェクトで確認をしておくととても幸せになれます。

Unity側構成

UnityEditor用DLLをPlugins配下に、HoloLens実機用DLLをPlugins/WSA配下に配置します。
DLLには下記の設定を行います。

[UnityEditor用DLL]

f:id:peugeot-106-s16:20170404225917p:plain

[HoloLens用DLL]

f:id:peugeot-106-s16:20170404225932p:plain

ここで重要なのがPlaceholderの設定です。

どうもWindowsStore形式へのビルドプロセス内ではDLLが持つインターフェイスのチェックを行っているようなのですが、そのチェックにはHoloLens用DLLではなくUnityEditor用DLLが用いられるようです。

そのインターフェイスチェックを行うDLLの指定がPlaceholderの設定となります。

この理由からUnityEditor用DLLとHoloLens用DLLは全く同じインターフェイスとなっている必要があります。

まとめ

HoloLens用 Managed Pluginの作り方は以上となります。
また、HoloLensのUWPまわりのコードの開発効率を上げる方法として、HoloLens実機にDLLをデプロイする前に、UWPのUnitTestプロジェクトでデバッグと動作確認を行っておくというTipsについてもご紹介しました。