はじめに
WEBアプリなどでファイルを保存するときにフォルダの場所をエクスプローラーで指定することができます。これをHoloLens 2のアプリで実装できるかどうか気になったので調べてみました。
環境
Unity 2020.3.26f1
MRTK 2.6.2
OpenXR Plugin 1.3.1
実装方法
HoloLens 2のアプリはUWPアプリなので、以下のページの方法が利用できます。
ピッカーでファイルやフォルダーを開く - UWP applications | Microsoft Docs
ただし、これをUnityで実装する場合、メインスレッドではなくUIスレッドで実行する必要があるそうです。ピッカーを実行する部分はUnityEngine.WSA.Application.InvokeOnUIThreadを使ってUIスレッドで実行するようにします。
(詳しくはページ下部の参考情報のリンクをご覧ください)
具体的には以下のようなスクリプトを作成します。
using System; using UnityEngine; using System.Threading.Tasks; public class testScript : MonoBehaviour { string folderPath = ""; public void FilePickerTest() { //UIスレッドで実行 UnityEngine.WSA.Application.InvokeOnUIThread(async () => { #if WINDOWS_UWP var folderPicker = new Windows.Storage.Pickers.FolderPicker(); folderPicker.FileTypeFilter.Add("*"); Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync(); if(folder != null) { folderPath = folder.Path; } else { folderPath = "Canceled"; } #endif //メインスレッドで実行 UnityEngine.WSA.Application.InvokeOnAppThread(() => { //ログにファイルパスを表示 Debug.Log($"Folder path : {folderPath}"); }, false); }, false); } }
あとはボタンを押すなどして「FilePickerTest」を実行すればフォルダを選択できます。
実際に利用すると以下のようになります。
フォルダパスが取得できていますね。
参考情報
HoloLensのUnity内でFilepicker使ってみた (akihiro-document.azurewebsites.net)
HoloLensでUnity/UWPのライブラリ両方使う際のスレッド問題について - Qiita