В дополнение к ответу @ frank-van-puffelen, я не верю, что Firebase RTDB сама по себе должна приводить к блокировке вашей игры до тех пор, пока не будет установлено сетевое соединение. Если ваша игра доступна при первом запуске без подключения к сети (ie: для вашей логики c не требуется начальное состояние из сети), вы можете проверить следующие проблемы:
Убедитесь, что вы можете справиться с null
. Если ваша игровая логика c находится в Coroutine
, Unity может решить молча остановить ее, а не полностью потерпеть неудачу.
Если вы взаимодействуете с базой данных через Транзакции , обычно предполагается, что он будет выполняться дважды (один раз для вашего локального кэша, затем снова, когда кэш синхронизируется с сервером, если значение отличается). Это означает, что в первый раз, когда вы выполняете изменение с помощью транзакции, у вас, скорее всего, будет null
предыдущее состояние.
Если вы можете, предпочтите прослушать ValueChanged вместо GetValueAsyn c. Вы всегда будете получать этот обратный вызов в своем основном потоке Unity, вы всегда будете получать обратный вызов при регистрации с данными в локальном кэше, и данные будут периодически обновляться по мере обновления сервера. Кроме того, если вы видите @ frank-van-puffelen ответ в другом месте , если вы используете GetValueAsync
, вы можете не получить ожидаемые данные (включая ноль, если пользователь не в сети). Если ваша игра заморожена, потому что она ожидает ContinueWithOnMainThread
(всегда предпочитайте это ContinueWith
в Unity, если у вас нет причин не делать этого) или await
, это может ValueChanged
также обойти это ( Я не думаю, что это так).
Дважды проверьте время жизни вашего объекта. Существует множество причин, по которым приложение может зависнуть, но при работе с асинхронной логикой c определенно убедитесь, что вы знаете о различиях между жизненным циклом Unity GameObject и типичным жизненным циклом объекта C# ( см. Это post и мой собственный , взаимодействующий с асинхронными логами c с Unity и Firebase ). Если объект OnDestroy
вызывается до await
, ContinueWith[OnMainThread]
или ValueChanged
, вы рискуете столкнуться с нулевыми ссылками в своем собственном коде. Это может произойти, если сцена изменяется, вызывается кадр после Destroy
или сразу после DestroyImmediate
.
Наконец, многие функции Firebase имеют Async
и синхронный вариант (например: CheckDependencies
и CheckDependenciesAsync
). Я не думаю, что есть что-то, что можно было бы вызывать для самой базы данных реального времени, но если вы используете не-асиновый c вариант функции (или если вы закручиваете блокировку при завершении задачи, в том числе забываете yield
в сопрограмме) , игра определенно остановится на некоторое время. Помните, что любой облачный продукт связан с вводом-выводом по своей природе и, как правило, будет работать медленнее, чем обновление вашей игры l oop (хотя Firebase старается быть максимально быстрым).
Надеюсь, это поможет !
- Патрик