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

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側で非同期で行われます.

123
#if UNITY_UWP
using Windows.Storage.Pickers;
#endif

1234
#if WINDOWS_UWP
using System;
using Windows.Storage.Pickers;
#endif

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

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

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

まとめ