かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

HoloLens で UWP の世界と Unity の世界を切り替える(まぁスレッド切り替えですね)

ビギナーが書いた記事なので突っ込みがあれば凄くほしいです。

UWP系APIのコールバックからUnityのオブジェクトを操作したり、UnityのUpdateメソッドとかからUWPのUIスレッド上で呼び出されるのを前提としたAPIは呼び出せないという問題があります。

最初はこちらのサイトにあるように

qiita.com

UnityPlayerの中のAppCallbacksクラスを使って解決しようとしました。

出来なかったこと

BehaviorからUnityPlayer名前空間を使おうとすると、そんなの参照されてるアセンブリにないということでエラーになりました。

Assembly-CSharp(Universal Windows)のプロジェクトに手動でUnityPlayer.winmdを参照追加するとビルドできるようになったのですが、今度は、そのコードを含んだプロジェクトに対してUnityからVisual Studioのプロジェクトをビルドして吐き出すときにUnityPlayerがないよってエラーになりました。

解決策

AppCallbacksクラスを使うのではなくUnityEngine.WSA.Applicationクラスを使うことにしました。

このクラスにはInvokeOnAppThread(Unityのスレッドに切り替える)メソッドとInvokeOnUIThread(UWPのUIスレッドに切り替える)というメソッドがあります。

docs.unity3d.com

こいつを使って切り替えができたっぽいです。

めでたしめでたし。