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 上的主要内容,如果未能解决你的问题,请参考以下文章