在MSFT全息透镜上打开Unity应用程序时,它首先创建一个空白的白框,供用户通过手势定位和放置。用户放置此白框后,应用程序将启动。用户可以通过执行“绽放”手势退出应用(但不一定关闭应用)。应用程序不会运行,前面提到的白框应该会重新出现(表示运行和关闭之间的“暂停”状态)。
问题是,有时应用程序可能已退出,但此白色框不显示。如果没有白色框,则用户无法正常关闭应用程序(通过单击右上角的X)。同样,如果应用程序已退出,而用户在返回下一个会话时不记得这一点,他们自然会再次尝试启动应用程序。如果上一个会话从未实际关闭,则可能会导致新打开的会话出现问题。
我如何限制HoloLens打开我的Unity应用程序的第二个实例,前提是之前打开了一个会话,并且该会话保持运行或从未关闭?
理想情况下,如果应用程序已经打开,当用户尝试打开应用程序时,全息透镜将刷新先前存在的实例,并将其带到用户视图中,或者在尝试打开新会话之前强制关闭先前的会话(以避免不希望的行为)。
通过在HoloLens上强制执行Unity应用程序的单个实例,这是处理此问题的最佳和最可靠的方法吗?或者检测实例是否已打开,并在再次尝试打开应用程序之前关闭该实例?哪一个是首选项,或者取决于首选项?
我在这个主题上找到的外部资源(很多中的一些):
如何确定应用程序是否在HoloLens上运行?这是我在这个主题上找到的最相关的信息来源。不幸的是,它没有涉及到如何做的应用程序是开放的肯定。Unity脚本引用-WSA(Windows应用商店应用)-再次没有提到强制执行单个运行实例
Unity脚本引用-OnApplicationQuit-不确定这是否适用于这种情况,但Unity有一种方法“在退出应用程序之前发送到所有游戏对象”。
在制品:
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将连接到一个网络并发出“无互联网,已连接”(尝试了受保护/未受保护的网络)。设备可能需要更新,但我们无法在没有网络连接的情况下检查更新。
为了澄清,这不是一个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-执行状态