我的探索是关于一个统一游戏引擎,但可能适用于所有游戏或所有应用程序在一般情况下。
我正在为统一编写一个插件,需要在游戏会话中的某些时候使用yield return UnityWebRequest.SendWebRequest()。理想情况下,如果用户关闭游戏,我也需要发送这样的请求(例如,关闭游戏运行的操作系统的窗口)。
统一的onApplicationQuit预定义回调可以,但是我似乎不能在那里启动协同线(异步操作),因为在应用程序终止时,所有的gameObjects都会被销毁,而且根本没有足够的时间来处理web请求:没有一个框架,即使在应用程序关闭时有“宽限期”,也不能在几个帧中启动。
游戏如何解决这些问题?一般情况下,应用程序如何解决这个问题?这是关于在所有东西都被破坏时启动异步操作,操作系统不会等待应用程序接收结果,甚至从一开始就发送请求。
想到的一个解决方案是尝试定期发送数据。不过,我已经这么做了。因此,问题在于最后一个请求没有被发送,因为应用程序正在突然关闭。
我可以想到的另一个解决方案是存储需要发送的数据(例如发送到PlayerPrefs,或者简单地以我自己的格式发送到某个自定义文件),并在下一个应用程序启动时检查是否有任何待发送的数据。但是,这并不总是适用于我的情况,因为:
还有一个解决方案:下载一个executalbe文件,当游戏关闭时,在onApplicationQuit中使用System.Diagnostics.Process运行该可执行文件,并在后台执行请求。所以,基本上,在游戏窗口关闭后,我会有另一个过程进行清理和报告。然而,这在两个方面是不好的:
还有其他解决办法吗?
(顺便说一句,我已经放弃了应用程序崩溃时的情况-除了我已经定期发送的请求之外,我不希望在那个时候发送任何东西)。
发布于 2019-09-04 19:06:21
另一个可能的解决方案是https://docs.unity3d.com/ScriptReference/Application-wantsToQuit.html。
当播放机应用程序想退出时,统一会引发此事件。 向此事件添加事件处理程序,以接收应用程序试图退出的通知。 引发此事件时,退出进程已经启动,但可以取消。这意味着玩家不能保证退出。对于一个有保证的退出事件,请看一下Application.quitting。 返回true,退出过程将继续。返回false,退出进程将取消。
你会抓住想退出的用户,发送你的网络请求,当它完成后,你自己打电话给Application.Quit。
https://stackoverflow.com/questions/57792640
复制相似问题