Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第一次安装时使用Firebase持久数据库_Firebase_Unity3d_Firebase Realtime Database - Fatal编程技术网

第一次安装时使用Firebase持久数据库

第一次安装时使用Firebase持久数据库,firebase,unity3d,firebase-realtime-database,Firebase,Unity3d,Firebase Realtime Database,我目前在Unity中开发的应用程序使用启用了数据库持久性的Firebase实时数据库。这对于离线使用应用程序(例如在没有信号的区域)非常有效 但是,如果新用户第一次在没有internet连接的情况下运行应用程序,应用程序将冻结。我猜,这是因为它需要第一次拉下数据库,以便持久性工作 我知道诸如“”之类的线程讨论如何处理与Firebase的数据库断开连接 但是,我是否可以检查用户是否是第一次使用该应用程序(例如,通过持久数据库的存在?)。然后我可以通知他们必须联机进行“首次设置”?Firebase数

我目前在Unity中开发的应用程序使用启用了数据库持久性的Firebase实时数据库。这对于离线使用应用程序(例如在没有信号的区域)非常有效

但是,如果新用户第一次在没有internet连接的情况下运行应用程序,应用程序将冻结。我猜,这是因为它需要第一次拉下数据库,以便持久性工作

我知道诸如“”之类的线程讨论如何处理与Firebase的数据库断开连接


但是,我是否可以检查用户是否是第一次使用该应用程序(例如,通过持久数据库的存在?)。然后我可以通知他们必须联机进行“首次设置”?

Firebase数据库API中没有任何内容可检测其脱机缓存是否已填充

但是,您可以检测何时连接到数据库,例如通过。然后,当第一个设置为
true
时,您可以在本地存储中设置本地标志,例如在
PlayerPrefs


使用此代码,您可以检测是否在
PlayerPrefs
中设置了该标志,如果未设置,则向用户显示一条消息,说明他们需要网络连接才能下载初始数据。

除了@frank van puffelen的回答,我不相信Firebase RTDB本身会导致您的游戏锁定,直到出现网络连接。如果您的游戏在首次启动时可以在没有网络连接的情况下玩(即:您的逻辑本身不需要网络的某些初始状态),您可能需要检查以下问题:

确保您可以处理
null
。如果您的游戏逻辑处于
协同程序中
,Unity可能会决定以静默方式停止它,而不是完全失败

如果您通过与数据库交互,通常假定它将运行两次(一次针对本地缓存,然后在缓存与服务器同步时再次运行,如果值不同)。这意味着,第一次通过事务执行更改时,您可能会有一个
null
previous状态

如果可以的话,你更愿意听一遍。您将始终在Unity主线程上获得此回调,在使用本地缓存中的数据注册后,您将始终获得回调,并且随着服务器的更新,数据将定期更新。此外,如果您看到@frank van puffelen,如果您使用的是
GetValueAsync
,则可能无法获得预期的数据(如果用户处于脱机状态,则包括空值)。如果您的游戏被冻结,因为它正在等待一个
ContinueWithOnMainThread
(除非您有理由不这样做,否则始终希望此操作优于
continueWithUnity
)或
wait
语句,这可能
ValueChanged
也可以解决此问题(我认为不应该是这种情况)

仔细检查对象的生命周期。应用程序可能会冻结的原因有很多,但在处理异步逻辑时,一定要注意Unity的GameObject生命周期与C#的典型对象生命周期(以及我自己的生命周期)之间的区别。如果在调用
await
ContinueWith[OnMainThread]
ValueChanged
之前调用了对象
OnDestroy
,则您自己的代码中可能会遇到空引用。如果场景发生变化,调用
Destroy
之后的帧,或者紧跟在
destroimmediate
之后,就会发生这种情况

最后,许多Firebase函数都有一个
Async
和同步变量(例如:
CheckDependenciesAsync
CheckDependenciesAsync
)。我不认为实时数据库本身有什么需要调用的,但是如果您使用函数的非异步变体(或者如果您在完成任务时锁定,包括忘记在协同程序中生成),游戏肯定会冻结一段时间。请记住,任何云产品都是i/o绑定的,通常运行速度比游戏的更新循环慢(尽管Firebase尽可能快)

我希望这有帮助

--帕特里克