かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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

めでたしめでたし。