FilePicker 在带有沉浸式 Unity 应用程序的 HoloLens 上挂起

FilePicker hangs on HoloLens with immersive Unity app

我正在尝试了解是否可以在沉浸式 Unity 应用程序中使用本机 HoloLens 文件选择器。到目前为止,我已经测试了 2 个样本,它们都可以工作,但前提是它们对整个应用程序使用 UI window。我一直在关注其他人的 SO 帖子并创建了这个:

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;


#if WINDOWS_UWP
using System;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.System;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Storage.Pickers;
#endif

...

    void Start()
    {
#if WINDOWS_UWP
        SelectJSON();
#endif
    }

#if WINDOWS_UWP
    void SelectJSON()
    {
        UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
        {
            debug.text = "starting filePicker";
            var filepicker = new FileOpenPicker();
            filepicker.FileTypeFilter.Add(".json");

            debug.text = "waiting for single file";
            var file = await filepicker.PickSingleFileAsync();
            UnityEngine.WSA.Application.InvokeOnAppThread(() => 
            {     
                debug.text = "about to read data";
                ReadData(file);
            }, false);
        }, false);
    }

#endif

在我的应用程序中,我到达了 'new FileOpenPicker()' 部分,这就是代码挂起的地方。我相信该应用程序正在尝试打开文件资源管理器 window,但由于我在沉浸式 Unity 应用程序中,它只是挂在那里,因为没有来自用户的响应。我之前已经输入了 try/catch 语句,但没有任何错误或异常。我在 Unity 中尝试了各种设置,例如默认全屏或 运行 在后台,但其中 none 没有任何作用。有没有人让本地 FilePicker 在他们的 Unity 应用程序中工作或者可以告诉我我做错了什么?

所以在进行了大量的故障排除之后,我发现了一些可行的方法。我使用的是 Unity 2020.3.13,但它也适用于旧版本。唯一不同的是 UWP 的检查类型。这会在我的沉浸式应用程序中调出文件资源管理器,让我可以选择我想要的文件并继续。

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#if WINDOWS_UWP
using System;
using Windows.Storage;
using Windows.System;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Storage.Pickers;
#endif

...

void Start()
    {
        OpenFile();
    }

public void OpenFile()
    {
#if !UNITY_EDITOR && UNITY_WSA_10_0

        UnityEngine.WSA.Application.InvokeOnUIThread(async () =>
        {
            var filepicker = new FileOpenPicker();
            filepicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
            filepicker.FileTypeFilter.Add(".json");

            var file = await filepicker.PickSingleFileAsync();
            UnityEngine.WSA.Application.InvokeOnAppThread(() => 
            {
                ReadData(file);

            }, false);
        }, false);

#endif
    }

...