在MSFT HoloLens上打开Unity应用程序时,它首先会为用户创建一个空白框,以便通过手势进行定位和放置。用户放置此白色框后,应用程序启动。用户可以通过执行'bloom'手势退出应用程序(但不一定关闭它)。该应用程序将不会运行,并且之前提到的白色框应该重新出现(表示这种'暂停'状态,就像在运行和关闭之间一样)。
问题是有时可能已退出应用,并且不会显示此白框。如果白盒不存在,则用户无法正常关闭应用程序(通过单击右上角的X)。同样,如果应用程序退出并且用户在返回下一个会话时不记得这一点,他们自然会尝试再次启动该应用程序。如果前一个会话从未实际关闭,则可能会导致新打开的会话出现问题。
如果会话先前已打开并且正在运行或从未关闭过,我如何限制HoloLens打开Unity应用的第二个实例?
理想情况下,如果应用程序已经打开,当用户尝试打开应用程序时,HoloLens将刷新以前存在的实例并将其带到用户视图或强行关闭上一个会话,然后再尝试打开新的实例(以避免不良行为)。
通过在HoloLens上强制执行Unity应用程序的单个实例来处理此问题是最好也是最可靠的方法吗?或者在尝试再次打开应用程序之前检测实例是否已打开并关闭该实例?哪一个(如果有的话)是首选的,还是偏好?
我在这个主题上找到的外部资源(少数几个):
How to determine if app is running on HoloLens - 我在该主题中找到的最相关的信息来源。不幸的是,它没有涉及应用程序开放的肯定。
Unity Script Reference - WSA(Windows应用商店应用) - 再次没有提及强制执行单个运行实例
Unity Script Reference - OnApplicationQuit - 不确定这是否适用于这种情况但是,有一种方法Unity“在应用程序退出之前发送给所有游戏对象”。
WIP:
private void App_Resuming(Object sender, Object e)
{
if (UnityEngine.VR.VRSettings.loadedDeviceName.Equals("HoloLens"))
{
UnityEngine.VR.VRDevice.SetTrackingSpaceType(UnityEngine.VR.TrackingSpaceType.Stationary);
UnityEngine.VR.InputTracking.Recenter();
UnityEngine.VR.VRDevice.SetTrackingSpaceType(UnityEngine.VR.TrackingSpaceType.RoomScale);
}
}
在Initialize方法中(在'App.cs'中)
public virtual void Initialize(CoreApplicationView applicationView)
添加
CoreApplication.Resuming += App_Resuming;
目前无法对此进行测试,因为Hololens将连接到网络并吐出“没有互联网,已连接”(尝试了受保护/未受保护的网络)。设备可能需要更新,但我们无法在没有网络连接的情况下检查更新。
答案 0 :(得分:1)
为了澄清,这不是一个hololens特定的问题,你需要看看是在windows 10 sdk,在Windows 8中它被称为墓碑,它是从一个应用程序移开而不关闭并能够恢复的行为,这是一篇关于在Windows 10应用程序中维护状态的文章的链接,在这里讨论和解释太久了。
https://visualstudiomagazine.com/articles/2015/09/01/its-universal.aspx
https://docs.microsoft.com/en-us/windows/uwp/launch-resume/app-lifecycle#app-execution-state