FilePicker 通过沉浸式 Unity 应用程序挂在 HoloLens 上

Posted

技术标签:

【中文标题】FilePicker 通过沉浸式 Unity 应用程序挂在 HoloLens 上【英文标题】:FilePicker hangs on HoloLens with immersive Unity app 【发布时间】:2021-10-29 04:42:23 【问题描述】:

我正在尝试找出是否可以在沉浸式 Unity 应用程序中使用本机 HoloLens 文件选择器。到目前为止,我已经测试了 2 个样本,它们都可以工作,但前提是它们为整个应用程序使用 UI 窗口。我一直在关注其他人的 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()”部分,这就是代码挂起的地方。我相信该应用程序正在尝试打开文件资源管理器窗口,但由于我处于沉浸式 Unity 应用程序中,它只是挂在那里,因为用户没有响应。我之前已经输入了 try/catch 语句,但没有任何错误或异常。我在 Unity 中尝试了各种设置,例如 Default FullScreen 或 Run In Background,但这些都没有做任何事情。有没有人让原生 FilePicker 在他们的 Unity 应用程序中工作,或者可以告诉我我做错了什么?

【问题讨论】:

请提供更多开发环境信息,如Unity版本号、Unity项目设置和构建设置、HoloLens系统版本等,并检查是否安装了应用(如 OneDrive),允许拾取。 我在 UWP 平台和 HoloLens 2 版本 21H1 上使用 Unity 2020.2.3。我在帖子中提到的两个示例没有安装 FilePicker 应用程序,所以我知道没有一个是可能的。 我对你的代码做了一点修改,让它在点击按钮后执行。然后,将其部署到设备上进行测试,对我来说效果很好。我正在使用 Unity 2020.3.1f,您可以升级 Unity 并重试吗?如果您看到相同的行为,请提供一个 MVCE(***.com/help/minimal-reproducible-example) 进行重现,以便我们定位问题或找到解决方案。 【参考方案1】:

因此,经过大量故障排除后,我发现了一些可行的方法。我正在使用 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
    

...

【讨论】:

以上是关于FilePicker 通过沉浸式 Unity 应用程序挂在 HoloLens 上的主要内容,如果未能解决你的问题,请参考以下文章

沉浸式概念在旅游产业链中的作用

沉浸式音视频互动要通过什么技术来实现?

沉浸式的普及成了文旅项目应用上的常规手段

Android中沉浸式状态栏的应用

沉浸式墙面互动+沉浸式展厅+沉浸式全息投影综合方案

云上解锁Web3.0 阿里云XR平台助力彼真科技呈现沉浸式演唱会