You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:16:14