Unity中Firestore已存在文档快照始终为空的问题求助
Firestore文档读取失败排查与修复方案
一、先补全异常信息,定位核心问题
你的代码没有捕获具体异常,根本无法知道读取失败的原因,先修改catch块输出详细错误:
catch (Exception ex) { Debug.LogError($"读取文档失败: {ex.Message}\n{ex.StackTrace}"); _limitedCarOfferData = null; }
大部分情况下,异常信息会直接告诉你是权限、网络还是初始化问题。
二、排查Firebase初始化状态
Unity中Firebase必须先完成依赖初始化才能正常调用Firestore接口,在读取操作前加入初始化校验:
IEnumerator Start() { var dependencyTask = FirebaseApp.CheckAndFixDependenciesAsync(); yield return new WaitUntil(() => dependencyTask.IsCompleted); if (dependencyTask.Result != DependencyStatus.Available) { Debug.LogError("Firebase依赖初始化失败,请检查SDK配置"); yield break; } // 初始化完成后再执行你的文档读取逻辑 StartCoroutine(CheckOfferDocument()); } IEnumerator CheckOfferDocument() { _checkOffer = true; var document = FirebaseFirestore.DefaultInstance.Collection("limitedOffer").Document("car"); var checkTask = document.GetSnapshotAsync(Source.Server); // 强制从服务器拉取,避免缓存干扰 yield return new WaitUntil(() => checkTask.IsCompleted); try { DocumentSnapshot snapshot = checkTask.Result; Debug.Log($"文档快照: {snapshot}"); Debug.Log($"文档是否存在: {snapshot.Exists}"); if (snapshot.Exists) { _limitedCarOfferData = snapshot.ConvertTo<LimitedCarOfferData>(); } else { _limitedCarOfferData = null; } } catch (Exception ex) { Debug.LogError($"读取失败: {ex.Message}\n{ex.StackTrace}"); _limitedCarOfferData = null; } }
三、关键细节检查
- 路径大小写敏感:Firestore的集合、文档名称区分大小写,检查控制台里的集合名是否是
limitedOffer,文档名是否是car,有没有拼写错误(比如写成LimitedOffer或CAR)。 - 离线缓存干扰:如果之前有离线操作,本地缓存可能没有同步服务器数据,用
Source.Server强制从服务器拉取,或者临时关闭持久化缓存测试:var settings = new FirebaseFirestoreSettings { PersistenceEnabled = false }; FirebaseFirestore.DefaultInstance.Settings = settings; - 规则权限验证:临时设置开放规则测试(上线后务必改回安全权限):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /limitedOffer/{doc} { allow read, write: if true; } } }
四、代码优化建议
如果你的Unity版本支持C# 8.0+,可以用async/await替代协程,代码更简洁易维护:
async void CheckOfferDocument() { _checkOffer = true; var document = FirebaseFirestore.DefaultInstance.Collection("limitedOffer").Document("car"); try { DocumentSnapshot snapshot = await document.GetSnapshotAsync(Source.Server); Debug.Log($"文档是否存在: {snapshot.Exists}"); _limitedCarOfferData = snapshot.Exists ? snapshot.ConvertTo<LimitedCarOfferData>() : null; } catch (Exception ex) { Debug.LogError($"读取失败: {ex.Message}\n{ex.StackTrace}"); _limitedCarOfferData = null; } }
内容的提问来源于stack exchange,提问作者Matei Megyesi
相关产品推荐
相关产品推荐

