なんかいろいろしてみます

Aug 27, 2018 - 1 minute read - HoloLens

HoloLensのUnity内でFilepicker使ってみた

HoloLens RS4からファイルエクスプローラーが標準で搭載されるようになり,Unity内でも利用が可能になりました.

(2018/09/12追記)#ifの記述を変更したらIL2CPPでも動作することが確認できました.

UNITY_UWPWINDOWS_UWPに変更してください

https://github.com/Microsoft/MixedRealityToolkit-Unity/blob/master/CodingGuidelines.md

動作環境

  • Unity 2017.4.8f1
  • Visual Studio 2017
  • HoloLens RS4

動作方法

Build設定

  • Build TypeはD3Dで動作可能
  • Build設定のPlayerSettings/Other Settings/Scripting Backendを.NETに変更
  • ファイルにアクセスするのでPlayerSettings/Publishing Settings/CapabilitiesからLibraryのチェックを入れておく

処理内容

FilePickerの処理をUWP側で非同期で行われます.

1#if UNITY_UWP
2using Windows.Storage.Pickers;
3#endif

1#if WINDOWS_UWP
2using System;
3using Windows.Storage.Pickers;
4#endif

FilePickerの呼び出しと利用はUnityのMainThreadでは行えないためUIThreadにて動作させる必要があります. 適当な関数内で以下を呼び出してください.

 1// 処理をUIのThreadに移動させる
 2UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
 3{
 4#if UNITY_UWP
 5  var filepicker = new FileOpenPicker();
 6  filepicker.FileTypeFilter.Add("*");
 7  var file = await filepicker.PickSingleFileAsync(); // FilePickerを起動して選択されるのを待つ
 8  UnityEngine.WSA.Application.InvokeOnAppThread(() => 
 9  {
10    // 処理をUnityのThread戻す
11    Debug.Log((file != null) ? file.Name : "No data");
12  }, false);
13#endif
14}, false);

 1// 処理をUIのThreadに移動させる
 2UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
 3{
 4#if WINDOWS_UWP
 5  var filepicker = new FileOpenPicker();
 6  filepicker.FileTypeFilter.Add("*");
 7  var file = await filepicker.PickSingleFileAsync(); // FilePickerを起動して選択されるのを待つ
 8  UnityEngine.WSA.Application.InvokeOnAppThread(() => 
 9  {
10    // 処理をUnityのThread戻す
11    Debug.Log((file != null) ? file.Name : "No data");
12  }, false);
13#endif
14}, false);

まとめ