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
}
...
我正在尝试了解是否可以在沉浸式 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
}
...